简介
什么是MongoDB
MongoDB是一个基于分布式文件存储的NoSQL数据库,基于C++语言开发而成的。它以文档存储格式(BSON)为基础,是由字段和值对组成的数据结构。
扩展:
BSON(Binary JSON)是一种二进制表示的JSON格式。它与JSON类似,是一种文本的数据交换格式。相比JSON,BSON具有以下优势:
二进制表示的JSON格式,使存储相同数据时,BSON需要的字节数更少,利于大规模数据的存储和传输;
支持更多数据类型;
支持嵌套文档和数组的表示,可更灵活地组织和表示复杂的数据结构。
MongoDB的逻辑结构
数据库(database):一个仓库,里面存放集合。
集合(collection):类似于数组,在集合中可以存放文档。
文档(document):文档数据库中的最小单位,存储和操作的内容都是文档。
Mongo数据类型
基本操作
在MongoDB中,数据库和集合不需要手动创建。当创建文档时,如果文档所在的集合或数据库不存在,数据库会自动创建!
基本指令
(1)查看当前所有数据库列表:show dbs/databases
(2)进入到指定的数据库: use 数据库名
注意:MySQL需先创建数据库才能使用,而MongoDB可直接使用use命令来指定一个并不存在的数据库。
(3)查询当前所处的数据库:db
(4)显示我们数据库中所有的集合:show collections
(5) 清屏:cls
CRUD操作
插入操作
(1)插入一个文档到集合中:db.collection.insertOne({field:value})
(2)插入多个文档到集合中:db.collection.insertMany([{field:value}])
(3)插入一个或多个文档到集合中:db.collection.insert()
注意:
向集合中插入文档时,没有给文档指定_id属性,则数据库会自动给文档添加_id,_id属性用来作为文档的唯一标识;
_id属性可自己指定,但必须确保唯一性,如果人为指定则数据库就不会再添加了。
(4)批量添加两万条数据的性能高,尽量少调用系统的方法
var arr=[];
for(var i=1;i<=20000;i++){ arr.push({num:i});
}
db.test.insert(arr);
查询操作
(1)查询集合中的数据:db.collection.find()
注意:查询后的结果默认按照_id的值进行升序排列
(2)限制查询返回结果的数量:limit(Integer id)
(3)排序查询结果:sort({field: [1|-1] })
文档对象参数需用一个属性来指定排序规则;排序规则1表示升序,-1表示降序。
(4)跳过指定数量的数据:skip(Integer id)
扩展:
(1)分页功能实现一般使用skip函数和limit函数。
skip( (页码-1)*每页显示的条数 ).limit(每页显示的条数)
(2)MongoDB中skip、limit、sort无论怎么组合使用,执行顺序都是sort>skip>limit;
(5)条件查询:find({field: value})
查询满足条件的一条数据:findOne({field: value})
(6)指定查询条件和返回字段:find(field: value}, {field: [0|1])
第二个参数用于设置查询结果的投影,属性对应的值1表示返回字段,0表示不返回字段。如果没指定属性_id不返回,则数据库会自动返回_id。
投影结果指定排除某些字段:比如返回sex字段以外的所有字段
扩展:
find方法的第二个参数对多个属性进行操作:
两处报错说明:
(1)MongoServerError:Cannot do exclusion on field sex in inclusion projection(属性sex不能在包含的投影中做排斥)
(2)MongoServerError: Cannot do inclusion on field sex in exclusion projection(属性sex不能在排除的投影中做包容)
(7)比较两个数:$gt大于,$lt小于,$eq等于,$gte大于等于,$lte小于等于。
(8)查询某个字段的值是否在数组中:$in在,$nin不在
(9)判断某个字段是否存在:$exists
$exists对应的值0或false表示不存在,1或true表示存在。
$exists只用于查询某个字段是否存在,不能用于查询某个字段值是否存在。
(10)复杂查询:and、or、not
1)逻辑与:$and: [{field: value}, {field: value}]
与逻辑与结果一致更简便的写法如下:
2)逻辑或:$or: [{field: value}, {field: value}]
3)逻辑非:$not: {field: value}
(11)正则表达式:$regex: /表达式/
(12)忽略大小写:$options: “i”
(13)统计文档数量:db.collection.countDocuments()
(14)统计查询数据的数量:db.collection.find().count()
(15)查询表中属性去重后的数据:db.collection.distinct(field)
更新操作
(1)更新数据:
更新满足条件的一条数据:updateOne({field: value}, {field: value})
更新满足条件的多条数据:updateMany({field: value}, {field: value})
更新满足条件的一条或多条数据:updateMany({field: value}, {field: value})
注意:第一个参数用于找要更新的对象;第二参数表示要更新的文档对象的值。如果更新的字段不存在,则数据库会自动创建这个字段。
(2)用来修改文档中的指定属性:$set: {field: value}
(3)用来删除文档的指定属性:$unset: {field: value}
(4)用于向数组中添加一个新的元素:$push(可重复添加)
(5)向数组中添加一个新元素:$addToSet(不可重复添加)
(6)替换一个符合条件的文档对象:db.collection.replaceOne({field:value}, {field:value})
第一个参数是查询条件用于找要替换的对象;第二参数表示替换后的对象。
扩展:
MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是文档时,我们称这个文档为内嵌文档。
MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过 . 的形式来匹配,且属性名必须使用引号(双引号单引号都行)。比如:db.users.find("hobby.movies":"hero")。
删除操作
(1)删除数据
删除满足条件的一条数据:deleteOne({field:value})
删除满足条件的多条数据:db.collection.deleteMany({field:value})
(2)删除数据库的集合:db.collection.drop()
如果最后一个集合没了,数据库也就没了!
(3)删除当前所在数据库 :db.dropDatabase()