update
一般有两种方法:替换操作如db.users.update({name:"xx"},newData,upsert,update)
,还有就是原子操作,即只更新部分数据,这里介绍原子操作;
其中的
upsert
为布尔值,表示是否在没有找到对象时直接创建一个新的对象;
udpate
为布尔值,false时只会更新第一个满足条件的对象,true会更新所有对象;
修改器
$set
用于增加新键或当键不存在时创建一个;如当数据库中有{"name":"heli", "keys":{"a1":12,"a2":23}}
想要更新keys中的a1, 代码:db.users.update({name:"heli"},{"$set":{"keys.a1":"haha"}})
。
$inc
用于为Number类型的键增加值,不能对String类型对象处理;当键不存在时,会创建一个新键,并设置为inc的值;
数组操作:$push $pop $pull
* 不存在则创建:{"$push":{comments":{name:"heli",docs:"xxxx"}}}
会往匹配的数据里的comments键对应的数组push增加一个数据,如果comments不存在,则会创建一个数组对象。
* 值已经存在数组里则不添加$ne
:
update({"authors":{"$ne":"heli"}},{$push:{"autors":"heli"}})
表示如果“authors”数组中没有“heli”值则push进去;
* $addToSet
完成了域$ne
同样的工作,但$addToSet
与$each
结合可以实现一次添加多个对象,且保证数组中没有重复的值;如:
db.users.update({"name":"xxx"},{$addToSet:{"emails":{$each:["a@gmail.com","b@gmail.com"]}}};
$pop
根据数组位置来删除对象:
{$pop:{key:-1}} // -1为数组尾,1为数组头;
$pop
根据数组元素的特殊键来删除:
如数组comments成员为{name, doc}两个属性,则可以通过name属性来删除所有满足条件的元素:
db.user.update({name:heli},{$pull:{comments:{name:"小明"}}})
数组定位
对于数组中的指定索引位置或满足一定条件的对象的修改方法,可以通过定位的方式来处理,假使数据库中已经有如下数据:
{
"_id":123,
"comments":[
{"name":"小明", age:20},
{name:"小花", age: 18}
]
}
- 对于指定索引的修改方式:
db.users.update({_id:123},{$inc:{"comments.0.age",5}})
该段代码是将小明的age增加5; - 不知道索引时:
通过条件查找,用$
来代表找到的对象,db.user.update({"comments.name":"小花"},{$set:{"comments.$.name":"小红"}})
,该代码将数组中的小花名字改成小红;