Mongodb 修改器

来源:互联网 发布:飞鸟淘宝客 编辑:程序博客网 时间:2024/04/30 05:47

增加、修改、删除键时,应该、一定要使用$修改器

有这样的信息:

> db.my_coll.findOne(){        "_id" : ObjectId("57d14dd9aaacc1383d8634d5"),        "url" : "www.misswall.cn",        "pv" : 8894}

(1) $inc原子操作:增加一个字段(键)的值,如果该键不存在则创建该键

db.my_coll.update({url:"www.misswall.cn"},{$inc:{pv:6}})
 pv的值变为8894+6

(2) $set修改一个键的值如果不存在则创建这个键
db.my_coll.update({url:"www.misswall.cn"},{$set:{memberCount:600}})
会多出memberCount这个键
{        "_id" : ObjectId("57d14dd9aaacc1383d8634d5"),        "url" : "www.misswall.cn",        "pv" : 8900,        "memberCount" : 600}

注意:同时使用多个$set,第一个$set有效,其他不起作用,例如:
db.my_coll.update({url:"www.misswall.cn"},{$set:{memberCount:699}},{$set:{vips:700}})
之后,memberCount的值会变,但不会增加vips这个键

当然,$set也可以修改键的数据类型,例如:把memberCount的数据类型变为集合类型
db.my_coll.update({url:"www.misswall.cn"},{$set:{memberCount:{man:399,female:300}}})
查看一下当前的集合结构:

> db.my_coll.findOne(){        "_id" : ObjectId("57d14dd9aaacc1383d8634d5"),        "url" : "www.misswall.cn",        "pv" : 8900,        "memberCount" : {                "man" : 399,                "female" : 300        }}

$set可以修改内嵌文档的键值,但使用时必须有引号,例如"memberCount.man"
db.my_coll.update({url:"www.misswall.cn"},{$set:{"memberCount.man":400}})> db.my_coll.findOne(){        "_id" : ObjectId("57d1554daaacc1383d8634d6"),        "url" : "www.misswall.cn",        "memberCount" : {                "man" : 400,                "female" : 300        }}

$unset来删除键
db.my_coll.update({url:"www.misswall.cn"},{$unset:{pv:1}})#删除pv键
#这个1不知道是什么用意,分别用0、-1、100来操作结果都是一样的;即都能删除键

查看执行后的结果:
> db.my_coll.findOne(){        "_id" : ObjectId("57d14dd9aaacc1383d8634d5"),        "url" : "www.misswall.cn",        "memberCount" : {                "man" : 399,                "female" : 300        }}

$inc来增加数值,只能用于整型、长整型或双精度浮点型的值;其他类型使用$set就ok
> db.mycoll.find().pretty(){"_id" : ObjectId("5864c27284fccb005dfbd870"),"count" : {"boy" : 60,"girl" : 41},"key" : "key1"}> db.mycoll.update({key:"key1"},{$inc:{"count.girl":2}});WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.mycoll.find().pretty(){"_id" : ObjectId("5864c27284fccb005dfbd870"),"count" : {"boy" : 60,"girl" : 43},"key" : "key1"}

数组修改器:

1.添加元素

$push:向已有的数组末尾加入一个元素,如果没有则创建一个新的数组;
> db.mycoll.find(){ "_id" : ObjectId("5864c27284fccb005dfbd870"), "key" : "key1" }> db.mycoll.update({"key":"key1"},{$push:{"array":1}});WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.mycoll.find(){ "_id" : ObjectId("5864c27284fccb005dfbd870"), "key" : "key1", "array" : [ 1 ] }

$push与$each一起使用,可以一次添加多个元素
> db.mycoll.update({"key":"key1"},{$push:{"array":{$each:[2,3,4]}}});WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.mycoll.find(){ "_id" : ObjectId("5864c27284fccb005dfbd870"), "key" : "key1", "array" : [ 1, 2, 3, 4 ] }

$push与$slice一起使用,限制数组最大长度(用负整数表示),只保留最新的那些元素
db.mycoll.update({"key":"key1"},{$push:{"array":{$each:[4,5,6],$slice:-5}}});WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.mycoll.find(){ "_id" : ObjectId("5864c27284fccb005dfbd870"), "key" : "key1", "array" : [ 3, 4, 4, 5, 6 ] }

控制重复:可以利用$ne与$push搭配

更加常用的是:$addToSet :不会增加重复的元素

$addToSet 与$each一起使用,可以一次添加多个元素

2.删除元素:
$pop只能删除两端的元素:
{$pop:{"key":1}} 从数组末尾删除一个元素
{$pop:{"key":-1}} 从数组头部删除一个元素

$pull删除所有匹配的元素:
db.mycoll.find(){ "_id" : ObjectId("5864c27284fccb005dfbd870"), "key" : "key1", "array" : [ 3, 4, 4, 5, 6 ] }> db.mycoll.update({"key":"key1"},{$pull:{"array":4}});WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.mycoll.find(){ "_id" : ObjectId("5864c27284fccb005dfbd870"), "key" : "key1", "array" : [ 3, 5, 6 ] }

3.基于位置的数组修改器

数组的下标从0开始,可以把下标直接作为键来选择元素:
db.mycoll.find(){ "_id" : ObjectId("5864c27284fccb005dfbd870"), "key" : "key1", "array" : [ 3, 5, 6 ] }> db.mycoll.update({"key":"key1"},{$inc:{"array.0":1}});WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.mycoll.find(){ "_id" : ObjectId("5864c27284fccb005dfbd870"), "key" : "key1", "array" : [ 4, 5, 6 ] }

但是很多情况下,不预先查询文档就不会知道要修改的数组的下标。这时候利用定位符:“$”,用来定位查询文档已经匹配到的数组元素,并进行更新;定位符只修改第一个匹配的元素。

db.blog.update({"comments.author":"Tom"},{$set:{"comments.$.author":"Jason"}});






未完待续。。。


1 0