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" : "女" }
							

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