集合方法

MongoDB有两个更新方法,一个是db.collection.update(),另一个更新命令是db.collection.save()


用法

db.collection.update(criteria,objNew,upsert,multi)

参数

参数 描述
criteria 查询条件,类似关系型数据库的update语句内where后面的内容。
objNew update的对象和一些更新的操作符(如$、$inc等),也可以理解为关系型数据库update语句内set后面的内容。
upsert 如果不存在update的记录,是否插入objNew这个新的document。true为插入,默认是false,不插入。
multi 默认是false,只更新找到的第一条记录。如果为true,按条件查出来的多条记录全部更新。

示例

先准备一些数据,如下面的代码所示:

>db.t1.insert({count:2,test2:"t12"})
>db.t1.insert({count:3,test2:"t12"})
>db.t1.find()
{"_id":ObjectId("4fe644d029735e5cd428fa76"),"count":2,"test2":"t12"}
{"_id":ObjectId("4fe644d029735e5cd428fa77"),"count":3,"test2":"t12"}

实验1 如下面的代码所示:

>db.t1.update({"count":{$gt:1}},{$set:{"test2":"OK1"}})
>db.t1.find()
{"_id":ObjectId("4fe644d029735e5cd428fa76"),"count":2,"test2":"OK1"}
{"_id":ObjectId("4fe644d029735e5cd428fa77"),"count":3,"test2":"t12"}

在本例中由于没有指定"upsert"和"multi"的值,这两个值都保持默认值false,所以即使找不到查询的记录也不会插入一条新数据;同时,即使查到多条记录也只会更新第一条记录。通过本实验可以看到,只有第一条记录被修改了。

实验2 如下面的代码所示:

>db.t1.update({"count":{$gt:1}},{$set:{"test2":"OK2"}},false,true)
>db.t1.find()
{"_id":ObjectId("4fe644d029735e5cd428fa76"),"count":2,"test2":"OK2"}
{"_id":ObjectId("4fe644d029735e5cd428fa77"),"count":3,"test2":"OK2"}

在本例中由于指定了"multi"为true,所以如果查到多条记录,就会批量更新。通过本实验可以看到,符合条件的所有记录都被修改了。

实验3 如下面的代码所示:

>db.t1.update({"count":{$gt:4}},{$set:{"test5":"OK"}},true,false)
>db.t1.find()
{"_id":ObjectId("4fe644d029735e5cd428fa76"),"count":2,"test2":"OK2"}
{"_id":ObjectId("4fe644d029735e5cd428fa77"),"count":3,"test2":"OK2"}
{"_id":ObjectId("4fe647f8bea23d1d88500a07"),"test5":"OK"}

在本例中由于指定了"upsert"为true,所以如果查不到要更新的记录,就会插入一条新的记录。通过本实验可以看到,由于找不到"count"大于4的记录,所以插入了一条新记录。

集合方法