MongoDB学习笔记(一)
最近有些时间,就抽空研究了一下MongoDB,我以前经常使用关系型数据库,如Oracle、MySQL,对MongoDB只是有些很肤浅的了解,最近下决心要好好研究一下,主要的参考书有两本:《MongoDB 大数据处理权威指南(第二版)》、《MongoDB权威指南(第一版)》,后者的版本比较旧,但基本还可以用,基本的操作方式基本上差不多。我主要参考的是第一个本书,相对来说,第一本书比较简单,但入门比较容易,还带有PHP和Python的操作MongoDB的指南。
1、安装:MongoDB的安装比较简单,主站是www.mongodb.org,既有32位的版本,也有64位的版本,尽量使用64位的版本。
Windows环境下,可以下载对应的安装包,安装即可
Linux可以下载压缩包,如果使用Ubuntu或者Fedora的话,还可以通过在线档案库下载安装,这样可以安装到最新版本,具体安装内容可以参考https://docs.mongodb.org/manual/administration/install-on-linux/,这是mongoDB的官方文档,如果有什么问题,可以到这里查看一下,比较权威,内容也比较全。
我安装和测试的环境如下
Windows 10 专业版
MongoDB 3.0.6版,安装路径为D:\Program Files\MongoDB
为方便使用mongoDB,将其命令目录加入到环境变量Path里,默认命令保存在D:\Program Files\MongoDB\Server\3.0\bin
2、MongoDB相对于Oracle、Mysql来说,结构上要简单很多,同Oracle一样,其一个实例可以有多个数据库,数据库里面可以任意多个Collection,Collection类似于Oracle中的表概念,但是有本质的不容,Collection中的每一行保存的是键值对,叫Document,这也是mongoDB叫面向文档的数据的一个原因,如果对Json熟悉,理解这个也非常快,键很容易理解,可以理解为表中的列名,但是其值就比较特别了,可以是数组,也可以是键值对,并且Collection中的键非常自由,其下的Documnet可以拥有不同的键,简单来说,Documnet虽然属于一个Collection,但是其键值对是没有限制的,想怎么样,就怎么样。这种存储方式,既有其优势,也有其劣势。
优势:(相对关系型数据库来说)
1)由于存储方式简单,CUID的速度是非常快的,有这么一句话:mongoDB如果查询超过了1秒钟,必然是出了问题
2)同一Collection下的Document之间没什么硬性约束,不同的Collection之间也没有什么约束,所以没有关系型数据库的完整性要求,这一点对于复制、分片是非常重要的。
3)复制、分片相对关系型数据库来说,要容易的多,可以通过横向扩展来提升系统性能。
劣势:(相对于关系型数据库来说)
1)由于没有完整性约束,所以数据的规范性较为困难,需要良好的编程纪律和查错手段来约束
2)缺乏对事务的支持,不适合应用到财务系统
3)缺乏Collection联查功能(也许将来会有),很多关系型数据库需要的操作会很不方便,生成报表需要使用MapReduce才可以。
总之,MongoDB的性能、扩展、复制、分片有独特的优势,所以其不太适合于企业应用程序开发,但是非常适合互联网、云计算相关应用的开发,所以需要选择适合的范围用好它。
3、简单操作
1)启动
从命令行启动mongoDB的命令是mongod,需要指定端口和数据库数据路径,在本机建立了数据库目录d:\mongodb_data\db1,端口为27017
mongod --dbpath d:\mongodb_data\db1 --port 27017
2)连接
mongodDB提供了一个命令行接口mongo,这是一个Javascript的终端,可以通过javascript脚本来操作数据库
D:\>mongo 192.168.1.223:27017
MongoDB shell version: 3.0.6
connecting to: 192.168.1.223:27017/test
>
(192.168.1.223为本机ip,如果连接远程mongoDB,需要修改IP地址)
3)选择数据库
默认是连接到test数据库,我们创建一个新数据库,如shiyq,如下
> use shiyq
(需要注意,use是切换数据库的命令,如果没有这个数据库,系统会默认创建一个,而且数据库名是区分大小写的,所以用这个命令要细心一点)
> use shiyq
switched to db shiyq
> db
shiyq
> show dbs
local 0.078GB
test 0.078GB
testdb 0.078GB
> show collections;
>
可以看出db命令是显示当前数据库,show dbs是显示本实例中有哪些数据库,因为shiyq是新数据库,没有内容,所以没有显示出来,show collections显示本数据库中的Collection名称,目前还没有,所以没有显示。
4)创建Document
> db.students.insert({name:'王强',code:'s101-1',age:15});
WriteResult({ "nInserted" : 1 })
> db.students.insert({name:'刘欢',code:'s101-2',age:18});
WriteResult({ "nInserted" : 1 })
> db.students.insert({name:'赵成',code:'s101-3',age:17});
WriteResult({ "nInserted" : 1 })
> db.students.insert({name:'赵成',code:'s101-4',age:19});
WriteResult({ "nInserted" : 1 })
> db.students.insert({name:'赵成',code:'s101-5',age:19});
WriteResult({ "nInserted" : 1 })
collection名称是students,可以看到collection是不需要创建的,只要创建其下的document就可以了;
> db.students.find()
{ "_id" : ObjectId("560b95bd3bd6389af11ee3d0"), "name" : "王强", "code" : "s101-1", "age" : 15 }
{ "_id" : ObjectId("560b961c3bd6389af11ee3d1"), "name" : "刘欢", "code" : "s101-2", "age" : 18 }
{ "_id" : ObjectId("560b96353bd6389af11ee3d2"), "name" : "赵成", "code" : "s101-3", "age" : 17 }
{ "_id" : ObjectId("560b963c3bd6389af11ee3d3"), "name" : "赵成", "code" : "s101-4", "age" : 19 }
{ "_id" : ObjectId("560b96413bd6389af11ee3d4"), "name" : "赵成", "code" : "s101-5", "age" : 19 }
可以看出已经插入的数据,需要注意每一个Document都有一个_id字段,这个相当于Collection的主键,这个键值也可以手工指定,如果是系统指定,可以保证在复制、分片中没有冲突。
如果使用NodeJS,或者对Javascript比较熟悉,上面的内容也非常容易理解。
5)更新
语法:db.collection.update(criteria,objNew,options)
criteria是过滤条件,objNew是新的内容,options={upsert:true,multi:true},upsert=true,如果存在更新,否则创建,multi=true,如果多条数据符合,则全部更新,默认只更新第一条(需要注意,如果不指定键,无法使用multi=true),需要注意的是这里的objNew会完全替代原始内容,如果要修改单个键值,不能用这个方法。
> db.students.update({name:'王强'},{grade:1});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.students.find() );
{ "_id" : ObjectId("560b95bd3bd6389af11ee3d0"), "grade" : 1 }
6)删除:
> db.students.remove({grade:1});
WriteResult({ "nRemoved" : 1 })
其他的操作还有很多,比如
db.collection.save(),有_id更新,没有则新增
$inc 增加值
$set 修改单个键值
$unset 删除键值
$push 向数组键中增加值
$pull 从数组键中删除所有值
$pullAll 从数组中删除多个值
$pop 删除数组中最后一个值
上述$的同一语法为db.collection.update(criteria,{$set:{Author:'shiyq'});
MongoDB学习笔记(一)的更多相关文章
- MongoDB学习笔记系列
回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...
- PHP操作MongoDB学习笔记
<?php/*** PHP操作MongoDB学习笔记*///*************************//** 连接MongoDB数据库 **////*************** ...
- MongoDB 学习笔记(原创)
MongoDB 学习笔记 mongodb 数据库 nosql 一.数据库的基本概念及操作 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table ...
- mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...
- MongoDB学习笔记(转)
MongoDB学习笔记(一) MongoDB介绍及安装MongoDB学习笔记(二) 通过samus驱动实现基本数据操作MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB ...
- 【转】MongoDB学习笔记(查询)
原文地址 MongoDB学习笔记(查询) 基本查询: 构造查询数据. > db.test.findOne() { "_id" : ObjectId("4fd58ec ...
- MongoDB学习笔记(六)--复制集+sharding分片 && 总结
复制集+sharding分片 背景 主机 IP 服务及端口 Server A ...
- MongoDB学习笔记(五)--复制集 && sharding分片
主从复制 主从节点开启 主节 ...
- MongoDB学习笔记(四)--索引 && 性能优化
索引 基础索引 ...
- MongoDB学习笔记(三)--权限 && 导出导入备份恢复 && fsync和锁
权限 绑定内网I ...
随机推荐
- Nginx+Tomcat+Memcached实现会话保持
会话保持的三种方式 Session sticky会话绑定:通过在前端调度器的配置中实现统一session发送至同一后发端服务器 Session cluster会话集群:通过配置Tomcat保持所有To ...
- 设计模式的征途—21.迭代器(Iterator)模式
我们都用过电视机遥控器,通过它我们可以进行开机.关机.换台.改变音量等操作.我们可以将电视机看做一个存储电视频道的集合对象,通过遥控器可以对电视机中的频道集合进行操作,例如返回上一个频道.跳转到下一个 ...
- enote笔记法(2)——why的使用
章节:why的使用 用法: why 概念|词汇(比概念更一般的形式的keyword)|短语|句子 用法1: why 概念|why keyword([比概念更一般的形式的keyword]) “why 概 ...
- 支持多用户web终端实现及安全保障(nodejs)
背景 笔者近期从事在线IDE工作的开发,作为本地IDE普遍拥有的功能,terminal(命令行)对项目的git操作以及文件操作有着非常强大的支持.而之前没有web伪终端的情况下,仅仅提供已封装好的gi ...
- 【笔记】web 的回流与重绘及优化
最近看了幕课网 web 前端性能优化的课程,其中说到了浏览器的回流(reflow) 及 重绘(repaint).觉得以后面试或许会被问到所以做一下笔记: 课程从回流及重绘这两个点延伸出了一个知识点就是 ...
- openface 训练数据集
训练深度网络模型OpenFace还不是运用faceNet的model作为训练模型,所以在准确性上比faceNet要低,如果你只是做一个简单的分类,建议你看看官网的demo3(http://cmusat ...
- sqoop的导入导出
1.知道某列的值的增量导入(mysql------>文件) bin/sqoop import \--connect jdbc:mysql://bigdatcdh01:3306/test \--u ...
- SVN服务器
什么是SVN服务器? 1.协助多人开发的代码管理器: 2.会记录代码是谁写的,并且可以回退到任意版本: 3.冲突解决: 4.升级(项目分支). SVN的搭建: 1.在服务器端下载SVN服务器,一个项目 ...
- 求知的木头 Cannot load browser "PhantomJS": it is not registered! Perhaps you are missing some plugin? 测试安装遇到的BUG
原文链接 求知的木头 Cannot load browser "PhantomJS": it is not registered! Perhaps you are missin ...
- Linux 链接详解(2)
可执行文件加载执行过程: 上一节我们说到ELF文件格式,静态库的符号解析和重定位的内容.这一节我们来分析一下可执行文件. 由上一节我们知道可执行文件也是ELF文件,当程序被加载器加载到内存时是按照EL ...