`
chakey
  • 浏览: 359629 次
  • 性别: Icon_minigender_1
  • 来自: 水星
社区版块
存档分类
最新评论

【8】MongoDB使用手册--数据更新(Updating)

阅读更多

 

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}})

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics