mongodb学习记录之二:更新操作

db.collection.update({查询器},{修改器})

文档存入数据库后,可以使用update来更新文档,update有两个参数,一个是查询器,一个是修改器。

还有第三个,第四个可选参数:第三个设为true,表示upsert,即如果不存在则进行插入。第四个设为true表示,批量操作

文档替换

文档替换是用一个文档替代匹配的文档,这种适用于模式结构发生了较大变化的时候。

例如将下面结构的文档

{
	"name":"joe",
	"friends":32,
	"enemies":2
}
							
变化成以下结构:

{
	"username":"joe",
	"relationships":{
		"friends":32,
		"enemies":2
	}
}
			
可以使用update来替换文档:

>var joe = db.users.findOne({"name":"joe"});
>joe.relationships = {"friends":joe.friends,"enemies":joe.enemies};
{
	"friends":32,
	"enemies":2
}
>joe.username = joe.name
"joe"
>delete joe.friends;
true
>delete joe.enemies;
true
>delete joe.name;
true
>db.users.update({"name":"joe"},joe)
这里是将查询出来的文档,赋给js的一个对象,然后将js对象的属性进行替换,最后使用update进行整个文档的替换。

修改器

修改器名称 语法 案例
$set {$set:{field:value}} {"$set":{"name":"coolcao"}}
$set用来指定一个键值对,如果存在就进行修改,不存在就进行添加
$inc {$inc:{field:value}} {"$inc":{"count":1}}
$inc只适用于数字类型,可以为指定的键对应的数字进行加减操作。
$unset {$unset:{field:1}} {"$unset":{"name":1}}
$unset用于删除指定的键
$push {$push:{field:value}} {"$push":{"books":"js"}}
如果指定的键是数组,追加新的数值如果指定的键不是数组,则终端当前操作(cannot apply $push/$pushAll modifier to non-array)如果不存在指定的键,则创建数组类型的键,进行追加
$pushAll {$pushAll:{field:array}} {"$pushAll":{books:["java","js"]}}
用法和$push相似,添加数组到数组
$addToSet {$addToSet:{field:value}} {"$addToSet":{"books":"js"}}
目标数组存在则此项不操作,不存在则添加进去。

和$push相似也是对数组进行操作,但是$push允许重复,$addToSet不允许重复

$pop {$pop:{field:value}} {"$pop":{"name":1}}{"$pop":{"name":-1}}
从指定的数组删除一个值。1删除最后一个值,-1删除第一个值。
$pull {$pull:{field:value}} {"$pull":{"books":"js"}}
删除一个被指定的数值
$pullAll {$pullAll:{field:array}} {"$pullAll":{"books":["js","java"]}}
一次性删除多个值

upsert

upsert是一种特殊的更新,如果没有符合条件的更新,就会以这个条件和更新文档为基础创建一个新的文档。如果找到了符合条件的文档,则正常更新。

db.collection.update({查询器},{修改器},true)

例如,存储学生信息的collection结构如下:

{
        "_id" : ObjectId("532a545274d02410efb93691"),
        "name" : "赵小强",
        "sex" : "女",
        "score" : {
                "math" : 15,
                "english" : 15,
                "chinese" : 13
        }
}
							
现在我们不知道里面有没有一个叫"大兵"的学生,我们想为名为“大兵”的学生更新喜欢的书籍books为["唐诗三百首","儿歌欢乐唱"]

>db.students.update({"name":"大兵"},{$pushAll:{"books":["唐诗三百首","儿歌欢乐唱"]}},true)
							
这里我们将第三个参数设为true,如果找不到名为"大兵"的文档,则插入一个名为大兵的文档,添加books键,值为["唐诗三百首","儿歌欢乐唱"]

更新多个文档

db.collection.update({},{},,true)

如果不进行upsert,则第三个参数空着不填即可。

例如,我们将所有女生的书籍books中都添加一本“跟着三毛去流浪”,可以使用以下语句:

>db.students.update({"sex":"女"},{$push:{"books":"跟着三毛去流浪"}},true,true)
							

更新完成后,数据如下:

{ "_id" : ObjectId("532a545274d02410efb93692"), "books" : [  "跟着三毛去流浪" ], "name" : "赵小乐", "score" : 
	{ "math" : 53, "english" : 83, "chinese" : 20 }, "sex" : "女" }
{ "_id" : ObjectId("532a545274d02410efb93693"), "books" : [  "跟着三毛去流浪" ], "name" : "赵小千", "score" : 
	{ "math" : 13, "english" : 26, "chinese" : 47 }, "sex" : "女" }
{ "_id" : ObjectId("532a545274d02410efb93694"), "books" : [  "跟着三毛去流浪" ], "name" : "赵小斌", "score" : 
	{ "math" : 76, "english" : 37, "chinese" : 89 }, "sex" : "女" }
{ "_id" : ObjectId("532a545274d02410efb93698"), "books" : [  "跟着三毛去流浪" ], "name" : "赵小玲", "score" : 
	{ "math" : 8, "english" : 79, "chinese" : 41 }, "sex" : "女" }
							

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章