插入文档
使用insert
向集合中插入一个文档:
1 | > db.test.insert({"name":"mrbird"}) |
插入的文档没有“_id”键的话,这个操作会自动为文档添加一个“_id”键。 批量插入文档则需使用insertMany
函数,函数接收一个文档数组:
1 | > db.test.insertMany([{"name":"Jane"},{"name":"KangKang"}]) |
要查看一个文档的大小,可以使用Object.bsonsize(doc)
函数(单位为字节):
1 | > Object.bsonsize(db.test.find({"name":"mrbird"})) |
删除文档
删除文档使用remove
函数,接收一个查询文档,所有匹配的文档都将会被删除:
1 | > db.test.remove({"name":"mrbird"}) |
要清空整个集合的话,可以使用drop
函数:
1 | > db.test.drop() |
更新文档
使用update
函数更新文档,接收两个参数,查询文档和修改器文档,如:
1 | > db.test.findOne({"name":"mrbird"}) |
$inc
修改器用来增加或减少已有的键值,如果该键不存在则创造一个。比如:
1 | > db.test.findOne({"name":"mrbird"}) |
$inc
只能用于整型,长整型或双精度浮点型的值。
$set
用于修改文档的字段值,当这个字段不存在的时候就创建一个。如:
1 | > db.test.findOne({"name":"mrbird"}) |
$set
还可以修改键的类型,比如将note键的值改为数组类型:
1 | > db.test.update({"_id":ObjectId("58a9ace92363ff29a7d881e9")}, |
$set
也可以修改内嵌文档,比如:
1 | > db.blog.findOne() |
使用$unset
可删除键,比如:
1 | > db.test.update({"_id":ObjectId("58a9ace92363ff29a7d881e9")}, |
数组修改器
$push
会向已有的数组末尾添加一个值,如果数组不存在,则创建该数组。比如:
1 | > db.blog.findOne() |
如果要一次性向数组中添加多个值,可以使用$push
结合$each
修改器。比如:
1 | > db.blog.update({"name":"mrbird's blog"}, |
$slice
可以在为数组添加值的时候截取数组,但必须配合$push
和$each
一起使用,否则报语法错误,比如:
1 | > db.user.findOne() |
从结果可以看出,$slice
截取了数组最新的三个值。注意,$slice
的值必须是负整数。
现在有这么一种情况,$push
修改器可以向一个数组中添加重复的值,如:
1 | > db.user.findOne({"name":"mrbird"}) |
如果希望数组中添加的值不重复的话,可以使用$addToSet
修改器:
1 | > db.user.update({"name":"mrbird"}, {"$unset":{"email":1}}) |
删除数组元素有几种方法,比如$pop
,{“$pop”:{"key":1}}
表示从数组尾部删除元素,-1则表示从头部删除:
1 | > db.user.findOne({"name":"mrbird"}) |
另外一个删除数组元素的修改器为$pull
,该操作符会将所有匹配的元素从数组中删除。比如:
1 | > db.user.update({"name":"KangKang"}, |
还可以通过数组的下标修改数组内容,如下所示:
1 | > db.blog.find({"name":"mrbird's blog"}).pretty() |
这种做法有局限性,就是必须先知道待修改字段的数组下标,可以使用另外一种方法,下面这种方法只需要知道待修改字段就行了:
1 | > db.blog.update({"comments.msg":"四国以"}, |
update
函数的第三个参数为upsert
,设置为true
时,新一个文档,没有找到匹配的查询文档时,插入该文档,找到了就更新,比如:
1 | > db.blog.findOne({"name":"mrbrid","post":"MongoDB文档CUD"}) |
update函数的第四个参数为multi
,设置为true
的时候,批量更新和查询文档匹配的文档,比如将mrbird’s blog集合中所有文档的pageview增加1:
1 | > db.blog.find().pretty() |
另外,调用getLastError
可查看最近一次更新的文档数量,如:
1 | > db.runCommand({getLastError:1}) |
拥有类似事务特性的更新与查询操作findAndModify
。它是原子性的,会返回符合查询条件的更新后的文档。一次最多只更新一个文档,也就是条件query
条件,且执行sort
后的第一个文档。语法如下:
1 | db.COLLECTION_NAME.findAndModify({ |
query是查询选择器,与findOne的查询选择器相同。
update是要更新的值,不能与remove同时出现。
remove表示删除符合query条件的文档,不能与update同时出现。
new为true:返回更新后的文档,false:返回更新前的,默认是false。
sort:排序条件,与sort函数的参数一致。
fields:投影操作,与find的第二个参数一致。
upsert:与update的upsert参数一样。
例子:
1 | > db.blog.findAndModify({ |
可发现,执行findAndModify
后,返回被更新前(默认显示更新前的)的文档,并且只更新了匹配的第一条文档。
如果要返回被更新后的文档,我们设置new 为true:
1 | > db.blog.findAndModify({ |
《MongoDB权威指南》读书笔记