一、 简介
NoSQL 的概念:指的是非关系型数据库。 NOT only sql 的缩写。特别适用于大规模
的数据存储。例如:谷歌或者facebook 每天为用户收集亿万级别的数据,这些数据类型不需要固定的格式,无需多余的操作就可以进行横向扩展。
什么是mongodb?
是C++语言开发,性能比较好,可以为web应用提供扩展的高性能数据存储解决方案。Mongodb将数据存储为一个文档,数据结构由键值(key value)对组成,文档类似于 json对象,并且字段值可以包含其它文档,即文档可以进行嵌套,还可以是数组,文档数组等等。
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
{“name”:”joho”,”age”:18,”address”:{“country”:”china”,”zip-code”:”10000”}}
Mongodb 是一个介于关系型数据库和非关系型数据之间的产品,是一个最像关系型数据库的非关系型数据库产品。它支持的数据类型非常的松散,多元。存储格式类似json格式,叫bson(二进制Json),因此支持存储的数据更丰富和复杂。
{name:”sue”,
AGE:26,
Status:”A”,
Groups:[“new”,”sports”]
}
MongoDB最大的特点是支持的查询语言非常强大,语法有点类似面向对象的查询语句,几乎可以实现关系型数据库绝大多数功能,并且支持索引。
缺点:不支持连表查询,不支持事务存储过程,不适用于数据间关系比较复杂的数据,一般都是当做数据仓库来使用。
例如:适用于:日志系统,股票数据系统等等
不适用于:电子商务平台,物流系统等等,数据关系复杂的系统。
Mongodb 和 mysql 性能进行比较
前提:分别插入 100万条数据记录,并对其中100个用户并发查询
二、 Mongodb 概念解析
在mongodb 中基本概念有: 文档 、 集合 、数据库、数据体系
1、 文档
文档是mongodb 中最基本的单元,类似于关系型数据库中的行(数据记录),多个键
值对有序的放置在一起的便是一个文档。
Mongodb 中以文档的存储方式记录数据,如一条记录格式如下:
{“username”:”shasha”,”age”:18,”email”:”shasha@126.com”,’sex’:’男’}
{“username”:”shasha2”,”age”:”18”}
{“username”:”shasha22”}
{name:”sue”,AGE:26,Status:”A”,Groups:[“new”,”sports”]}
注意:1)以上是几个不同的文档,mongodb 是区分大小写的数据类型,第一个文档中18表示数字类型,第二个文档中 age 是字符串类型。
2)每个文档尺寸不能超过16M
3)文档中键/值 对是有序的,值不仅可以在双引号里面的字符串,还可以是其他数据类型,或者是嵌套一个完整的文档。
4)一个文档中不能有重复的键。
2、集合
集合就是一组文档,多个文档组成一个集合,集合类似于mysql里面的表。集合是无模式的,是指在同一个集合中可以包含不同格式的文档,如:
{“username”:”shasha”,”age”:18,”email”:”shasha@126.com”,’sex’:’男’}
{“username”:”shasha22”}
{“name”:”joho”,”age”:18,”address”:{“country”:”china”,”zip-code”:”10000”}}
以上三个文档可以放在同一个集合中。如果是在mysql数据库中,需要先创建表,再插入数据,并且数据格式要一致。MongoDB 中集合的模式自由,集合中没有行和列的概念,没有固定的格式,即同一个集合可以插入不同格式的数据(文档),不同类型的文档。
注意:MongoDB 中集合不用创建,没有结构,在插入第一个文档的时候,集合可以同步创建。
合法的集合名
集合名不能是空字符“”。
集合名不能包含\0 字符,这个字符表示的是集合名的结尾。
集合名不能以”system.”开头,这是为系统集合保留的前缀。
用户创建的集合名字不能包含保留字符,有些驱动程序确实支持集合里面包含保留字符,但是大多数不支持,例如名字中包含 $ ,不要在名字中出现。
3、数据库
多个集合可以组成数据库,一个MongoDB实例中可以承载多个数据库,他们之间完全
独立,mongodb中的数据库概念和 MySQL 中数据库概念类似,都是用来存储数据的,只是mongodb 中的数据库无需创建。
特点:一个数据库中可以有多个集合
一个集合中可以有多个文档
数据库也是通过名字来标识的,数据库名可以是有以下满足条件的任意的utf-8字符串。
不能有空字符:””
不能含有空格,或者. 或者 $ 或者 / 、 \ 、\0
应全部小写
最多64个字节
4、MongoDB的数据体系
三、 MongoDB 安装配置
1、windows 环境下安装 mongodb
下载安装包
安装
启动服务
客户端打开,测试连接
详见《Windows 下部署搭建mongodb.docx》
2、 linux 下环境安装
详细内容参照操作说明手册
四、 入门语句
1、 创建数据库
语法: use 数据库名称
2、 查看数据库
语法:show dbs
Mongodb 默认有3个数据库:admin、local 、config
Admin: 管理权限的,添加 root 用户,用来管理其他所有非root 用户的权限,有一些特定的服务器命令必须在admin 库下执行;
Local: 这个数据永远不会被赋值,可以用来存储限于本地单台服务器的任何集合;
Config:当mongodb 用于分片设置时,config 数据库在内部使用,用于保存分片信息。
3、 创建集合
注意:mongodb 里面的集合是隐式创建,就是无需创建,直接使用。
语法:db.集合名.insert({}) 意思:向集合里面添加文档。这个集合会在语句执行的创建同时把文档插入其中。
db.clco2.insert({“username”:“jojo”,“age”:36,“sex”:“女”});
db.clco2.insert({“username”:“jojo222”,age:36,“sex”:“女”});
db.clco2.insert({“username”:“jojo222”,age:36,‘sex’:‘女’});
4、查看集合
语法:show tables
show collections
5、 查看集合中的文档
语法: db.集合名.find() 查询所有
db.集合名.findOne() 查询的是第一个文档
6、删除集合
语法: db.集合名.drop();
7、删除数据库
语法:db.dropDatabase(),删除的是当前所在的数据库
8、帮助命令
数据库相关的帮助命令
语法:db.help()
集合相关的帮助命令
语法:db.集合名.help()
五、增删改查操作
1、添加文档
语法: db.集合名.insert({k1:’v1’,k2:’v2’,…})
3.2版本以后插入文档的语法还支持如下:
db.collection.insertOne():向指定的集合插入一条文档数据,只能插入一条
db.collection.insertMany():向指定的集合中插入多条文档数据,多个文档作为一个列表,文档之间用, 间隔。
db.集合名.insertMany([{},{},{}])
/* 添加文档 */
show dbs;
use test;
db.php.insert([{name:‘hanmeimei’,age:‘8’,sex:‘女’},{name:“呜呜”}]);
db.php.insert({name:‘lily1’,age:‘8’,sex:‘女’});
db.php.find();
db.php.insertOne({name:‘lilei22’,age:‘8’,sex:‘女’});
db.php.insertMany([{name:“呼呼”},{name:“haha”},{age:‘28’}]);
注意点:文档就是键值对,数据类型是 BSON,是json的扩展,支持的值更丰富
ObjectID 类型:
每个文档都有一个_id字段,并且同一个集合中_id的值是唯一的,该字段可以是任意类型的数据,默认就是一个ObjectID 对象。
ObjectID 对象数据组成:时间戳|机器码|PID|计数器,_id键值我们自己定义输入,但是一定不能重复,如果自己不输入,就会系统默认自动生成。
db.php.insert({’_id’:100,name:‘sunsun’});
WriteResult({ “nInserted” : 1 })
可以使用js 代码来完成批量插入文档
// 方法一:循环实现
for( var i=1;i<=100;i++)
{
db.php222.insert({‘name’:‘xiaoxiao’+i,age:i,‘email’:‘xiaoxiao’+i+’@126.com’});
};
db.php222.find()
// 方法二:1)先创建列表;2)将数据放在列表中;3)一次insert 到集合中
var arr=[];
for(var i=200;i<=2000;i++){
arr.push({num:i});
};
db.php333.insert(arr);
db.php333.find();
2、 删除文档
语法:db.集合名.remove({条件}) (不写条件删除所有的集合中的文档)
db.php22.find();
db.php.find();
db.php.remove({name:‘呜呜’});
db.php222.remove({}); // 表示删除集合中所有的数据
常见的操作符:
l t , lt, lt,lte, g t , gt, gt,gte(<,<=,>,>=) , n e ( < > ) , ne(<>), ne(<>),in , n i n , nin, nin,or, n o t , not, not,mod(取模), e x i t s , exits, exits,where
// 操作符编写条件
db.php333.remove({num:204});
db.php333.remove({num:{’$lte’:208}});
叮嘱:在执行 remove()函数之前,建议使用 find()命令判断执行的条件是否正确,
这是一个比较好的习惯。
命令:db.集合名.remove({}) 可以实现清空集合的目的
db.php333.find({num:{’$lte’:230}}); // 带条件查询
3、 更新文档
方法一:直接修改
语法:db.集合名.update({条件},{新的文档})
db.php333.update({num:214},{num:1114444});
注意:出现的问题,符合条件的数据有多条,但是修改更新只更新第一条文档记录,并且新文档不修改的键值没有了。
方法二:使用修改器
$inc :加一个数字(针对的修改的原值是数字)
$set :修改某一个字段,如果该字段不存在,则新增该字段
修改一条语句:
语法: db.集合名.update({条件},{修改器名称:{修改的键:修改的新值}})
db.php333.update({num:211},{$inc:{num:3}});
修改多条语句:
语法: db.集合名.update({条件},{$set:{新文档}},是否新增,是否修改多条)
是否新增:如果值是1(true),则没有满足条件时新增添加一个全新的文档
是否修改多条:如果值是1 (true),如果满足条件有多个文档,则都要修改
db.php.update({age:“8”},{$set:{name:“露露”}},true,true);
db.php.update({age:“8”},{$set:{name:“露露112”}},true,false);
db.php.find({age:“8”});
小结:如果文档只有一个键,并且一次只修改一个文档记录,并且修改的就是原键的值,使用方法一完全ok
如果要实现批量修改,并且有多个键,对不修改的键没有影响,就使用方法二,并且要加参数。
4、 查询文档
语法:db.集合名.find({条件})
操作符使用频率最高的:
大于: $gt >
大于等于: $gte >=
小于:
l
t
<
小
于
等
于
:
lt < 小于等于:
lt<小于等于:lte <=
等于 equal = $eq
不等于 not equal != <> $ne
实例1: 查询集合中第一个文档
db.php.findOne();
实例2:查询集合中某一个键等于**值的文档信息
db.php.find({age:“28”});
db.php.find({age:{’$eq’:“28”}});
实例3:查询集合中大于某一个值的文档信息
db.php.find({age:{’$gt’:“28”}});
实例4:查询集合中大于某一个值,小于某个值,即范围内文档信息
相当于mysql 中:select * from php333 where num>221 and num<249;
db.php333.find({num:{‘
l
t
′
:
249
,
′
lt':249,'
lt′:249,′gt’:221}});
// 值是否需要加引号,要根据插入文档时的数据类型决定,要和插入文档时数据类型保持一致,数值类型不加引号,字符类型必须加引号。
实例5:只显示某一个键值信息或者不显示这个键值信息
db.php.find({},{name:1}) ; // 只查询显示 name 键及对应的值信息
db.php.find({},{name:0}) ; // 表示除了name 键值以外不显示,其它的都显示
实例6:显示集合中前几个文档,比如查询显示前3个文档
db.php333.find().limit(3);
实例6:查询显示集合中第3个文档到第5个文档
db.php333.find().skip(2).limit(3);
实例7:统计集合中文档的个数
db.集合名.count() // 返回集合中有多少文档个数
db.php.count();
实例8:模糊查询
//查询name中包含“露”的文档信息
db.php.find({name:/露/});
// 查询以“露”开头的文档
db.php.find({name:/^露/});
// 查询以“露”结尾的文档
db.php.find({name:/露$/});
5、 mongodb 中 limit 与 skip 方法
(1) limint() 方法
在mongodb 中想要读取指定数量的文档数据记录,可以使用 limit() 方法,它接收一个数字参数,表示从集合中读取对应的记录文档数。
db.php333.find().limit(3);
db.php.find({name:/露$/}).limit(4);
db.php.find({name:/露$/}).limit();
// 没有指定limit 的参数,返回的是满足查询条件的所有文档记录
(2) skip() 方法
在mongodb中用来跳过指定数量的数据,同样也是接收一个数字参数,表示跳过的
记录数。
db.集合名.find({条件}).limit().skip()
db.php.find({name:/露$/}).limit(1).skip(1);
// 表示返回满足条件的查询结果1条记录,跳过1条,只显示的是第二条文档记录
备注:skip() 方法 默认参数值为0,可以省略。
6、 查询排序
在mongodb 中使用 sort() 方法对进行排序,sort()方法可以通过参数指定排序的字段,并且使用 1 或者 -1 来指定排序的方式, 其中 1 为升序排序, 而 –1 为降序排序。
db.集合名.find().sort({键名:排序方式})
db.php222.find({age:{’$lt’:58}}).sort({age:1})
db.php222.find({age:{’$lt’:58}}).sort({age:-1})
备注:skip() 、limit()、sort() 三个放在一起执行的时候,执行的顺序是先 sort(), 然后是skip(),最后是显示 limit()。