4.4 更新文档
Mongodb的增删查都已经学完了,只剩下更新了。在mongodb中提供了update()和save()方法用于更新一个文档,update()是使用最多的,save()在前面4.1插入文档的时候已经介绍了,这里就不再介绍了。
update语法如下:
db.collection.update(criteria,objNew,upsert,multi)
参数说明:
criteria:设置查询条件,用于查询哪些文档需要被更新.
objNew:更新后的对象
upsert:设置为真的时候如果记录已经存在,更新它,否则新增一个记录,默认为false
multi:设置为真的时候,将会更新所有符合查询条件的文档。在mongodb中默认情况下只会更新第一条符合的文档。此方法必须与某些$开头的方法配合使用。
> db.user.find()
{ "_id" : 1, "name" : "user1","age" : 1 }
{ "_id" : 2, "name" : "user2","age" : 2 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 6 }
>db.user.update({name:"user1"},{name:"user11"}) -->我们可以省略后两个参数
> db.user.find()
{ "_id" : 1, "name" : "user11" }
{ "_id" : 2, "name" : "user2","age" : 2 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 6 }
我们本想将user1改为user11,其他不变,但是我们看查询结果,mongodb将我们的整个文档更新了.所以我们如果要是使用上面那样的方式,更新文档,将会更新整个文档.这点需要注意.那么我们怎样才能只将user1,更新为user11呢 我们只要使用mongodb的$set方法即可,在后面我会讲解.
> db.user.find()
{ "_id" : 2, "name" : "user2","age" : 2 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 6 }
{ "_id" : 1, "name" : "user1","age" : 1 }
{ "_id" : 7, "name" : "user1","age" : 7 }
{ "_id" : 8, "name" : "user1","age" : 8 }
> db.user.update({name:"user1"},{name:"user11"},1,0)/*只会更新一条数据,但是如果在这里我们直接将最后一个参数改为1,将会报错,因为这个参数需要与$方法联合使用 */
> db.user.find()
{ "_id" : 2, "name" : "user2","age" : 2 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 6 }
{ "_id" : 1, "name" : "user11" }
{ "_id" : 7, "name" : "user1","age" : 7 }
{"_id":8,"name":"user1","age":8} >db.user.update({name:"user111"},{name:"user111"},1,0)/*这时候我们更新name为user111的文档,但是没有,我们的第三个参数设置为了true,所以这时候将会插入一条新的文档,结果如下面一样 */
> db.user.find()
{ "_id" : 2, "name" : "user2","age" : 2 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 6 }
{ "_id" : 1, "name" : "user11" }
{ "_id" : 7, "name" : "user1","age" : 7 }
{ "_id" : 8, "name" : "user1","age" : 8 }
{ "_id" : ObjectId("519a2c8259827a002f7e5ace"),"name" : "user111" }
显示一下第四个参数:
>db.user.update({name:"user1"},{$set:{name:"userNew"}},0,1)
> db.user.find()
{ "_id" : 2, "name" : "user2","age" : 2 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 6 }
{ "_id" : 1, "name" : "user11" }
{ "_id" : 7, "age" : 7, "name" :"userNew" }
{ "_id" : 8, "age" : 8, "name" :"userNew" }
{ "_id" : ObjectId("519a2c8259827a002f7e5ace"),"name" : "user111" }
这里我们使用$set,这个就是只是去修改文档中某些值,而不是更新整个文档。
4.4.1 更新方法
在mongodb中提供了很多与更新操作有关的方法,我们也可以叫它更新操作符。这些操作符主要可以分为两类:字段和数组。
字段组的主要包括:$inc、$rename、$setOnInsert、$set、$unset。
数组组的主要包括:$addToSet、$pop、$pullAll、$pull、$pushAll、$push、$each、$slice、$sort。
下面我们详细的介绍一下。
$inc
语法:db.collection.update({ field: value }, { $inc: { field1: amount } } );
为一个字段添加加上一个值,这个方法只能对数字操作,也就是说只能给数字加上一个值,当然这个值可以是负数。
> db.user.find()
{ "_id" : 2, "name" : "user2","age" : 2 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }