精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-11-09
最后修改:2011-05-27
update() 语法结构是: db.collection.update( criteria, objNew, upsert, multi ) 参数: criteria - 查询需要更新的项; objNew - 更新的对象或者 $ operators (例如 $inc) 这样的操作因子 upsert - 是否是 "upsert"; 也就是说如果记录不存在是否插入新的记录 multi - 是否所有满足criteria的在整个文档都更新 注意:在缺省情况下,update()只会更新第一个满足条件的项。如果需要修改所以的满足条件的 项的话,需要使用multi这个标志位。
下面出现的upsert均表示:如果存在就更新,如果不存在就插入。
注意:
1、update方法只更新一条记录 2、update方法的更新参数
save() 对单个对象进行upsert时,mongo shell中的save()是个简便的方法。 ××××××××××××× // x is some JSON style object db.mycollection.save(x); // updates if exists; inserts if new ××××××××××××× upsert的效果如下: myColl.update( { name: "Joe" }, { name: "Joe", age: 20 }, true );
使用修改操作集(Modifier Operations) MO对于更新已经存在的项很高效,特别适合进行累加运算。 举个例子: 找到第一个name是Joe的文档,然后将n递增1. 使用传统的方法: var j=myColl.findOne( { name: "Joe" } ); j.n++; myColl.save(j);
使用MO方式就可以简写成: db.people.update( { name:"Joe" }, { $inc: { n : 1 } } );
这种方式简洁,高效,很少的网络数据传输(当然性能更好)。 注意: 大多数的MO操作符是支持多键值对更新的,例如如下操作会使x等于1,y为2: { $set : { x : 1 , y : 2 } } 使用MO: { $set : { x : 1 }, $inc : { y : 1 } }
下面介绍一下MO操作符: $inc { $inc : { field : value } } 如果fileid在前面的object部分,则按value值递增;反之,则将fieid赋值为value. $set { $set : { field : value } } 将field设置为value,$set 支持所有的数据类型。
$unset { $unset : { field : 1} } 删除指定的field.
$push { $push : { field : value } } 如果fileld是个数组的话,将value追加到数组中; 如果fileld没有定义,那么就将fileld赋值为数组[value]; 如果fileld已经存在但不是数组的话,就会报错!
$pushAll { $pushAll : { field : value_array } }
$addToSet { $addToSet : { field : value } } 只有当这个value不在这个数组里的时候才会添加valuse到数组中。 主持增加多个值,例如: { $addToSet : { a : { $each : [ 3 , 5 , 6 ] } } }
$pop { $pop : { field : 1 } } 删除数组中最后一个元素。 同理: 删除数组中第一个元素: { $pop : { field : -1 } }
$pull { $pull : { field : _value } } 如果field是个数组的话,删除里面出现的所有字段值。 如果fileld存在但不是个数组,就会报错。 { $pull : { field : {field2: value} } } 删除和field2中匹配的所有元素 { $pull : { field : {$gt: 3} } }删除数组中大于 3 的所有元素 { $pull : { field : {$elemMatch: {field2: value }} } } 删除和field2内嵌元素匹配的所有元素
$pullAll { $pullAll : { field : value_array } }
$rename (版本1.7.2以上的支持). { $rename : { old_field_name : new_field_name } }
在更新过程中,如果希望在更新大量数据的时候,被更新的文档禁止写入的话,在查询中可以使用 atomic 这个标记,例如: db.students.update({score: {$gt: 60}, $atomic: true}, {$set: {pass: true}})
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 3513 次