update()
语法结构是:
db.collection.update( criteria, objNew, upsert, multi )
参数:
criteria - 查询需要更新的项;
objNew - 更新的对象或者 $ operators (例如 $inc) 这样的操作因子
upsert - 是否是 "upsert"; 也就是说如果记录不存在是否插入新的记录
multi - 是否所有满足criteria的在整个文档都更新
注意:在缺省情况下,update()只会更新第一个满足条件的项。如果需要修改所以的满足条件的
项的话,需要使用multi这个标志位。
 
下面出现的upsert均表示:如果存在就更新,如果不存在就插入。
 
注意:
 
1、update方法只更新一条记录
默认情况下update只更新符合查询条件的第一条找到的记录。如果想更新所有符合条件的记录,需要手动添加 multi 这个参数。 
2、update方法的更新参数
像下面这个语句
myColl.update( { _id: X }, {name: "Joe", age: 20 });
会把符合条件的原纪录按照{name: "Joe", age: 20 }完整替换,而不是简单的将name设为"Joe",age设为20.
如果只想更改这2个值,而不是替换完整对象,应该写
myColl.update( { _id: X },{$set: {name: "Joe", age: 20 }}); 
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}})