1. 执行update相关操作都可以使用修改器.
2. 修改器是为了不整个大文档来替换修改, 而是修改局部
3. 详情:
3.1 $inc (自增)
为增加某个字段的数值
例子:
原文档如下:
{ "_id" : ObjectId("4b253b067525f35f94b60a31"), "url" : "www.example.com", "pageviews" : 52 }
执行修改器 $inc
db.test.update({url:’www.example.com’},{$inc:{pageviews: 1}})
表示为pageviews这个 key 的值 加上1. 后面是对应要加上的值.
注意, $inc中, 字段对应的值只能是 数字. 但是可以是 正数也可以是负数. 如果是负数, 就是执行一个减法操作.
3.2 $set (设置)
修改某个字段的值为指定的值. 这里的修改是与字段类型无关的. 你可以把一个string修改成long或者一个对象都行.
例子:
原文档如下:
{ "_id" : ObjectId("4b253b067525f35f94b60a31"), "name" : "joe", "age" : 30, "sex" : "male", "location" : "Wisconsin" }
修改性别, 变成false (String -> Boolean)
执行修改器 $set
db.test.update({name:'joe'}, {$set:{sex:false}})
表示将 name为joe的这个对象的 sex修改为false
3.3 $unset (删除字段)
这个修改器是为了删除某个指定的字段及其值.
例子:
原文档如下:
{ "_id" : ObjectId("4f9105377522000000006be0"), "howlong" : 6, "lovePerson" : "zhanying", "person" : "jiacheo" }
把howlong删除
执行修改器 $unset
db.test.update({person:'jiacheo'},{$unset:{howlong:1}})
后面的1没具体意义, 相当于确认
3.4 $push (把一个数据放到数组里面)
例子:
原文档如下:
{ "_id" : ObjectId("4f9105377522000000006be0"), "lovePerson" : "zhanying", "person" : "jiacheo", "supporters" : [ "gongjin" ] }
执行修改器, 增加一个人到supporters里面
db.test.update({person:'jiacheo'},{$push:{supporters:'ziming'}})
这时候变成:
{ "_id" : ObjectId("4f9105377522000000006be0"), "lovePerson" : "zhanying", "person" : "jiacheo", "supporters" : [ "gongjin", "ziming" ] }
若果再执行一遍上面的代码, 那么数组还是会加上同样的名称, 如果你需要排同, 可以用后面这个修改器
3.5 $addToSet (将一个对象放到集合里面. 集合里面不会出现两个重复的一模一样的对象)
例子:
原文档如下:
{ "_id" : ObjectId("4f9105377522000000006be0"), "lovePerson" : "zhanying", "person" : "jiacheo", "supporters" : [ "gongjin", "ziming" ] }
执行修改器 $addToSet
db.test.update({person:'jiacheo'},{$addToSet:{supporters:'ziming'}})
文档内容没有改变..
以上两个修改器还可以配合 $each, 把一个数据里的数据append到另一个数组上去(后者会排重)
比如:
db.test.update({person:'jiacheo'}, {$addToSet:{supporters:{$each: ["gongjin","ziming","liuxun","feidu"] }}})
执行后, 结果如下:
{ "_id" : ObjectId("4f9105377522000000006be0"), "lovePerson" : "zhanying", "person" : "jiacheo", "supporters" : ["gongjin", "ziming", "feidu", "liuxun" ] }
3.6 $pop 队列出列 (按数组索引顺序出列(正序或者倒序))
例子:
原文档如下:
{ "_id" : ObjectId("4f9105377522000000006be0"), "lovePerson" : "zhanying", "person" : "jiacheo", "supporters" : ["gongjin", "ziming", "feidu", "liuxun" ] }
执行修改器 $pop
db.test.update({person:'jiacheo'},{$pop:{supporters:1}})
修改后变为
{ "_id" : ObjectId("4f9105377522000000006be0"), "lovePerson" : "zhanying", "person" : "jiacheo", "supporters" : [ "gongjin", "ziming", "feidu" ] }
value 值为1 表示数组索引靠后的先出列, 也就是后进先出, 相当于出栈的概念. value值为-1表示数组索引考前的先出列, 也就是先进先出, 相当于一个FIFO的队列
3.7 $pull (符合条件的元素出列)
与上一个相比, 这个修改器会把符合条件的元素从数组中删除, 而不是简单的按照索引值的大小来处理.
原文档如下:
{ "_id" : ObjectId("4f9105377522000000006be0"), "lovePerson" : "zhanying", "person" : "jiacheo", "supporters" : [ "gongjin", "ziming", "feidu" ] }
执行修改器 $pull
db.test.update({person:'jiacheo'},{$pull:{supporters: 'gongjin'}})
修改后:
{ "_id" : ObjectId("4f9105377522000000006be0"), "lovePerson" : "zhanying", "person" : "jiacheo", "supporters" : [ "ziming", "feidu" ] }
可以见, gongjin从supporters中被remove掉了.
这里所有被匹配的元素都会被出列