MongoDB增删改查
插入操作
Insert
Mongodb 是面向文档存储的数据库,文档结构形式叫 BSON(类似 JSON)。
> db.c1.insert({name:"user1"}) > db.c1.insert({name:"user2"}) > db.c1.insert({name:"user3"}) > db.c1.find() { "_id" : ObjectId("5762f567f845d1cdb792d0a1"), "name" : "user1" } { "_id" : ObjectId("5762f56af845d1cdb792d0a2"), "name" : "user2" } { "_id" : ObjectId("5762f56cf845d1cdb792d0a3"), "name" : "user3" }
> db.c1.insert({name:'user1',post:{title:'test',content:'this is test'}}) > db.c1.insert({name:'user2',post:[1,2,3,4,5]}) > db.c1.find() { "_id" : ObjectId("5762f851f845d1cdb792d0a4"), "name" : "user1",
"post" : { "title" : "test", "content" : "this is test" } } { "_id" : ObjectId("5762f86cf845d1cdb792d0a5"), "name" : "user2",
"post" : [ 1, 2, 3, 4, 5 ] }
save
功能类似于insert操作,但是如果插入是2个相同的_id,insert会报错,save不会报错,会进行更新操作。
> db.c1.insert({_id:1,name:"user4"}) > db.c1.insert({_id:1,name:"user4"}) E11000 duplicate key error index: test.c1.$_id_ dup key: { : 1.0 } > db.c1.save({_id:1,name:"user4"}) > db.c1.save({_id:1,name:"user4"}) > db.c1.find(); { "_id" : ObjectId("5762f567f845d1cdb792d0a1"), "name" : "user1" } { "_id" : ObjectId("5762f56af845d1cdb792d0a2"), "name" : "user2" } { "_id" : ObjectId("5762f56cf845d1cdb792d0a3"), "name" : "user3" } { "_id" : 1, "name" : "user4" }
删除操作
remove
--删除c1集合中的所有数据 > db.c1.remove() --有选择条件的删除数据 > db.c1.remove({name:"user3"})
查询操作
find
--查询所有的 > db.c1.find() { "_id" : ObjectId("5762f942f845d1cdb792d0a6"), "name" : "user1" } { "_id" : ObjectId("5762f945f845d1cdb792d0a7"), "name" : "user2" } --查询带条件的 > db.c1.find({name:"user1"}) { "_id" : ObjectId("5762f942f845d1cdb792d0a6"), "name" : "user1" }
选取特定的列
> db.c1.find({name:"user1"},{name:1,_id:0}) { "name" : "user1" }
条件表达式
1)<,<=,>,>=
> for(i=1;i<=5;i++){ ... db.c1.insert({name:"user"+i,age:i}); ... } > db.c1.find() { "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 } ----大于 > db.c1.find({age:{$gt:3}}) { "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 } --小于 > db.c1.find({age:{$lt:3}}) { "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 } --大于等于 > db.c1.find({age:{$gte:3}}) { "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 } --小于等于 > db.c1.find({age:{$lte:3}}) { "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 } --等于 > db.c1.find({age:5}) --不等于 > db.c1.find({age: {$ne:5}})
2)$all
$all 操作类似$in 操作,但是不同的是, $all 操作要求数组里面的值全部被包含
在返回的记录里面。
> db.c2.insert({name:"user1",post:[1,2,3,4,5]}); > db.c2.find() { "_id" : ObjectId("576300b0f845d1cdb792d0ae"), "name" : "user1", "post" : [ 1, 2, 3, 4, 5 ] } > db.c2.find({post:{$all:[1,2,3]}}) { "_id" : ObjectId("576300b0f845d1cdb792d0ae"), "name" : "user1", "post" : [ 1, 2, 3, 4, 5 ] } > db.c2.find({post:{$all:[1,2,6]}}) > db.c2.find({post:{$all:[1,2,5]}}) { "_id" : ObjectId("576300b0f845d1cdb792d0ae"), "name" : "user1", "post" : [ 1, 2, 3, 4, 5 ] }
3)$exists
操作检查一个字段是否存在
> db.c2.find({age:{$exists:1}}) > db.c2.find({name:{$exists:1}}) { "_id" : ObjectId("576300b0f845d1cdb792d0ae"), "name" : "user1", "post" : [ 1, 2, 3, 4, 5 ] } >
4)$mod
操作可以让我们简单的进行取模操作,而不需要用到 where 子句,如:
> db.c1.find({age:{$mod: [2,1]}}) { "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 }
5)$ne
意思是 not equal,不等于
> db.c1.find({age:{$ne:3}}) { "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 }
6)$in
$in 操作类似于传统关系数据库中的 IN,看例子:
> db.c1.find({age:{$in:[1,3,5,6]}}) { "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 }
7)$nin
$nin 跟$in 操作相反,看例子:
> db.c1.find({age:{$nin:[1,3,5]}}) { "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 }
8)$or
--或者的关系 > db.c1.find({$or:[{name:"user2"},{name:"user3"}]}) { "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 }
9)$nor
$nor 跟 $or 相反
> db.c1.find({$nor:[{name:"user2"},{name:"user3"}]}) { "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 }
10)$size
$size 操作将会查询数组长度等于输入参数的数组,例子:
{ "_id" : ObjectId("576300b0f845d1cdb792d0ae"), "name" : "user1", "post" : [ 1, 2, 3, 4, 5 ] }
{ "_id" : ObjectId("5764104f16c0d12099a75ecd"), "name" : "user2", "post" : [ 3, 4, 6 ] }
> db.c2.find({post:{$size:3}})
{ "_id" : ObjectId("5764104f16c0d12099a75ecd"), "name" : "user2", "post" : [ 3, 4, 6 ] }
> db.c2.find({post:{$size:5}})
{ "_id" : ObjectId("576300b0f845d1cdb792d0ae"), "name" : "user1", "post" : [ 1, 2, 3, 4, 5 ] }
> db.c2.find({post:{$size:2}})
正则表达式
Mongodb 同样支持正则表达式进行检索
> db.c1.find() { "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 } > db.c1.find({name:/user2/i}) { "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 }
注意: /^a/; /^a.*/; /^a.*$/这三个表达式最后的效果一样,但是后两种查询
效率比第一种要低很多,因为后两种表达式会执行扫描整个字符串,然而第一种
扫描到第一个字符就停止了
选项:
-i: 忽略大小写
-m: 起始符^, 结束符$对于每一个新行都起作用
-x: 忽略空白字符
-s: 这个选项从 1.9 版本后才支持,加上它就可以让“ . ”表示所有字符了,包括
换行符,例如 /a.*b/不匹配"apple\nbanana" ,但是 /a.*b/s 可以
排序
Mongodb 支持排序
> db.c1.find().sort({age:-1}) { "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 } > db.c1.find().sort({age:1}).limit(2) { "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 }
Distinct
类似于关系数据库中的 Distinct
> db.c1.distinct("name") [ "user1", "user2", "user3", "user4", "user5" ] > db.c1.distinct("age") [ 1, 2, 3, 4, 5 ]
分页查询
Mongodb 支持 skip 和 limit 命令来进行分页查询
> db.c1.find().skip(2) { "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 } > db.c1.find().limit(1) { "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 } > db.c1.find().skip(2).limit(2) { "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 }
$elemMatch
> db.c3.find() { "_id" : ObjectId("5764156d16c0d12099a75ece"), "name" : "user1", "post" : [ { "title" : 11 }, { "title" : 22 }, { "title" : 33 } ] } { "_id" : ObjectId("5764157d16c0d12099a75ecf"), "name" : "user1", "post" : [ { "title" : "aaa" }, { "title" : "bbb" }, { "title" : "ccc" } ] } > db.c3.find({"post.title":33}) { "_id" : ObjectId("5764156d16c0d12099a75ece"), "name" : "user1", "post" : [ { "title" : 11 }, { "title" : 22 }, { "title" : 33 } ] } -->等同于 > db.c3.find({post:{$elemMatch:{title:22,title:33}}}) { "_id" : ObjectId("5764156d16c0d12099a75ece"), "name" : "user1", "post" : [ { "title" : 11 }, { "title" : 22 }, { "title" : 33 } ] }
Cursors 游标及 Cursor Methods
类似传统的关系型数据库, Mongodb 也有游标的概念。可以利用游标对查询结果进行遍历
> var data=db.c1.find() > data.next() { "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 } > data.hasNext() true
count()
count()方法返回查询记录的总数目
> db.c1.count() 5 > db.c1.find({age:{$lt:3}}).count() 2
NULL查询
{ "_id" : ObjectId("5764198416c0d12099a75ed0"), "name" : "user1" } { "_id" : ObjectId("5764198b16c0d12099a75ed1"), "name" : "user1", "age" : null } { "_id" : ObjectId("5764198f16c0d12099a75ed2"), "name" : "user1", "age" : 30 } --这种查询无法得到想要的结果 > db.c4.find({age:null}) { "_id" : ObjectId("5764198416c0d12099a75ed0"), "name" : "user1" } { "_id" : ObjectId("5764198b16c0d12099a75ed1"), "name" : "user1", "age" : null } > db.c4.find({age:{$type:10}}); { "_id" : ObjectId("5764198b16c0d12099a75ed1"), "name" : "user1", "age" : null } > db.c4.find({age:{$exists:1,$in:[null]}}) { "_id" : ObjectId("5764198b16c0d12099a75ed1"), "name" : "user1", "age" : null }
$slice
{ "_id" : ObjectId("5764156d16c0d12099a75ece"), "name" : "user1", "post" : [ { "title" : 11 }, { "title" : 22 }, { "title" : 33 } ] }
{ "_id" : ObjectId("5764157d16c0d12099a75ecf"), "name" : "user1", "post" : [ { "title" : "aaa" }, { "title" : "bbb" }, { "title" : "ccc" } ] }
> db.c3.find({name:"user1"},{post:{$slice:2}})
{ "_id" : ObjectId("5764156d16c0d12099a75ece"), "name" : "user1", "post" : [ { "title" : 11 }, { "title" : 22 } ] }
{ "_id" : ObjectId("5764157d16c0d12099a75ecf"), "name" : "user1", "post" : [ { "title" : "aaa" }, { "title" : "bbb" } ] }
> db.c3.find({name:"user1"},{post:{$slice:-1}})
{ "_id" : ObjectId("5764156d16c0d12099a75ece"), "name" : "user1", "post" : [ { "title" : 33 } ] }
{ "_id" : ObjectId("5764157d16c0d12099a75ecf"), "name" : "user1", "post" : [ { "title" : "ccc" } ] }
> db.c3.find({name:"user1"},{post:{$slice:[1,2]}})
{ "_id" : ObjectId("5764156d16c0d12099a75ece"), "name" : "user1", "post" : [ { "title" : 22 }, { "title" : 33 } ] }
{ "_id" : ObjectId("5764157d16c0d12099a75ecf"), "name" : "user1", "post" : [ { "title" : "bbb" }, { "title" : "ccc" } ] }
更新操作
update
语法
db.collection.update( criteria, objNew, upsert, multi )
参数说明:
Criteria:用于设置查询条件的对象
Objnew:用于设置更新内容的对象
Upsert:如果记录已经存在,更新它,否则新增一个记录
Multi:如果有多个符合条件的记录,全部更新
注意:默认情况下,只会更新第一个符合条件的记录
{ "_id" : ObjectId("5764198416c0d12099a75ed0"), "name" : "user1" } { "_id" : ObjectId("5764198b16c0d12099a75ed1"), "name" : "user1", "age" : null } { "_id" : ObjectId("5764198f16c0d12099a75ed2"), "name" : "user1", "age" : 30 } --把之前的属性替换了 > db.c4.update({name:"user1"},{sex:"man"}) > db.c4.find() { "_id" : ObjectId("5764198416c0d12099a75ed0"), "sex" : "man" } { "_id" : ObjectId("5764198b16c0d12099a75ed1"), "name" : "user1", "age" : null } { "_id" : ObjectId("5764198f16c0d12099a75ed2"), "name" : "user1", "age" : 30 } --如果更新的是不存储的文档,则无变化 > db.c4.update({name:"user6"},{name:"user66"}) --如果加上第三个参数,不存在,则添加 > db.c4.update({name:"user6"},{name:"user66"},1) --第四个参数为1时,匹配到多个时全部更改(需带$set),默认为0,只更改匹配到的第一个
save()
--如果存在更新它,如果不存在,新增记录 db.mycollection.save(x);
$set
把 field 的值设置成 value, 当 field 不存在时,增加一个字段, 类似 SQL 的 set 操作, value 支持所有类型
{ "_id" : ObjectId("5764198416c0d12099a75ed0"), "sex" : "man" } { "_id" : ObjectId("5764198b16c0d12099a75ed1"), "name" : "user1", "age" : null } { "_id" : ObjectId("5764198f16c0d12099a75ed2"), "name" : "user1", "age" : 30 } > db.c4.update({name:"user1"},{$set:{age:20}},0,1) > db.c4.find() { "_id" : ObjectId("5764198416c0d12099a75ed0"), "sex" : "man" } { "_id" : ObjectId("5764198f16c0d12099a75ed2"), "name" : "user1", "age" : 20 } { "_id" : ObjectId("5764198b16c0d12099a75ed1"), "age" : 20, "name" : "user1" }
$inc
把 field 的值加一个 value
{ "_id" : ObjectId("5764271916c0d12099a75edd"), "name" : "user1", "age" : "30" }
{ "_id" : ObjectId("5764271d16c0d12099a75ede"), "name" : "user2", "age" : "320" }
{ "_id" : ObjectId("5764272016c0d12099a75edf"), "name" : "user3", "age" : "20", "score" : 10 }
{ "_id" : ObjectId("5764272416c0d12099a75ee0"), "name" : "user4", "age" : "15", "score" : 22 }
--所有的文档加10积分,如果不存在属性,则添加
> db.c5.update({},{$inc:{score:10}},0,10)
> db.c5.find()
{ "_id" : ObjectId("5764271916c0d12099a75edd"), "age" : "30", "name" : "user1", "score" : 10 }
{ "_id" : ObjectId("5764271d16c0d12099a75ede"), "age" : "320", "name" : "user2", "score" : 10 }
{ "_id" : ObjectId("5764272016c0d12099a75edf"), "name" : "user3", "age" : "20", "score" : 20 }
{ "_id" : ObjectId("5764272416c0d12099a75ee0"), "name" : "user4", "age" : "15", "score" : 32 }
$unset
删除给定的字段 field
{ "_id" : ObjectId("5764271916c0d12099a75edd"), "age" : "30", "name" : "user1", "score" : 10 }
{ "_id" : ObjectId("5764271d16c0d12099a75ede"), "age" : "320", "name" : "user2", "score" : 10 }
{ "_id" : ObjectId("5764272016c0d12099a75edf"), "name" : "user3", "age" : "20", "score" : 20 }
{ "_id" : ObjectId("5764272416c0d12099a75ee0"), "name" : "user4", "age" : "15", "score" : 32 }
--删除score字段
> db.c5.update({},{$unset:{score:1}},0,1)
> db.c5.find()
{ "_id" : ObjectId("5764271916c0d12099a75edd"), "age" : "30", "name" : "user1" }
{ "_id" : ObjectId("5764271d16c0d12099a75ede"), "age" : "320", "name" : "user2" }
{ "_id" : ObjectId("5764272016c0d12099a75edf"), "age" : "20", "name" : "user3" }
{ "_id" : ObjectId("5764272416c0d12099a75ee0"), "age" : "15", "name" : "user4" }
$push
如果 filed 是一个已经存在的数组,那么把 value 追加给 field;
如果 field 原来不存在,那么新增 field 字段,把 value 的值赋给 field;
如果 field 存在,但是不是一个数组,将会出错;
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "name" : "user1", "arr" : [ 1, 2, 3 ] }
--存在,直接压入到最后
> db.c6.update({name:"user1"},{$push:{arr:4}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4 ], "name" : "user1" }
--原来不存在,则新增一个数组
> db.c6.update({name:"user1"},{$push:{arr11:4}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4 ], "arr11" : [ 4 ], "name" : "user1" }
$pop
删除数组中最后一个元素
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4 ], "arr11" : [ 4 ], "name" : "user1" }
> db.c6.update({name:"user1"},{$pop:{arr:1}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3 ], "arr11" : [ 4 ], "name" : "user1" }
> db.c6.update({name:"user1"},{$pop:{arr:1}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2 ], "arr11" : [ 4 ], "name" : "user1" }
$pushAll
功能同$push,只是这里的 value 是数组,相当于对数组里的每一个值进行$push操作
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2 ], "arr11" : [ 4 ], "name" : "user1" }
> db.c6.update({name:"user1"},{$pushAll:{arr:[3,4,5,6]}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6 ], "arr11" : [ 4 ], "name" : "user1" }
$addToSet
如果 filed 是一个已经存在的数组,并且 value 不在其中,那么把 value 加入到数组;
如果 filed 不存在,那么把 value 当成一个数组形式赋给 field;
如果 field 是一个已经存在的非数组类型,那么将会报错;
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6 ], "arr11" : [ 4 ], "name" : "user1" }
> db.c6.update({name:"user1"},{$addToSet:{arr:7}})
> db.c6.update({name:"user1"},{$addToSet:{arr:7}})
> db.c6.update({name:"user1"},{$addToSet:{arr:7}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6, 7 ], "arr11" : [ 4 ], "name" : "user1" }
--同时压入多个值
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6, 7 ], "arr11" : [ 4 ], "name" : "user1" }
> db.c6.update({name:"user1"},{$addToSet:{arr:{$each:[7,8,9]}}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "arr11" : [ 4 ], "name" : "user1" }
$pull
如果 field 是一个数组,那么删除符合_value 检索条件的记录;
如果 field 是一个已经存在的非数组,那么会报错;
--根据值来进行删除数组的元素 { "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "arr11" : [ 4 ], "name" : "user1" } > db.c6.update({name:"user1"},{$pull:{arr:9}}) > db.c6.find() { "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6, 7, 8 ], "arr11" : [ 4 ], "name" : "user1" } > db.c6.update({name:"user1"},{$pull:{arr:8}}) > db.c6.find() { "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6, 7 ], "arr11" : [ 4 ], "name" : "user1" }
$pullAll
同$push 类似,只是 value 的数据类型是一个数组
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6, 7 ], "arr11" : [ 4 ], "name" : "user1" }
> db.c6.update({name:"user1"},{$pullAll:{arr:[5,6,7]}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4 ], "arr11" : [ 4 ], "name" : "user1" }
$rename
重命名指定的字段名称
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4 ], "arr11" : [ 4 ], "name" : "user1" }
--将字段名arr改为post
> db.c6.update({name:"user1"},{$rename:{arr:"post"}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr11" : [ 4 ], "name" : "user1", "post" : [ 1, 2, 3, 4 ] }
特殊操作符: $
$操作符代表查询记录中第一个匹配条件的记录项。
{ "_id" : ObjectId("576431bc16c0d12099a75ee2"), "arr" : [ { "title" : "linux" }, { "title" : "php" }, { "title" : "java" } ], "name" : "user1" }
> db.c7.update({"arr.title":"linux"},{$set:{"arr.$.content":"linux is very much"}})
> db.c7.find()
{ "_id" : ObjectId("576431bc16c0d12099a75ee2"), "arr" : [ { "content" : "linux is very much",
"title" : "linux" }, { "title" : "php" }, { "title" : "java" } ], "name" : "user1" }
浙公网安备 33010602011771号