今天看書看到MongoDB權(quán)威指南這本書對(duì)update這一篇進(jìn)行了詳細(xì)詳解,因?yàn)橹R(shí)點(diǎn)有點(diǎn)多,所以博客記錄一下,如果只是看我覺得明天就忘了。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了鳳翔免費(fèi)建站歡迎大家使用!
更新文檔有兩種方式:
1,文檔替換 2,修改器替換(只是修改單個(gè)字段的內(nèi)容)
關(guān)于update有哪些參數(shù)可以看一下幫助文檔
db> db.blog.update function (query, obj, upsert, multi) query:條件 obj:對(duì)象,更新的類容 upsert:判斷更新的條件是否存在 multi:默認(rèn)情況下更新只對(duì)符合匹配條件的第一個(gè)文檔執(zhí)行操作,要是這個(gè)為true,就是配置內(nèi)容所以都更新
文檔替換
當(dāng)前的數(shù)據(jù)類型是
wangaimin> db.test.findOne({"name":"bob"}) { "_id" : ObjectId("58e4b6410b8bd344936c8553"), "name" : "bob", "email" : "bob@email.com.cn", "content" : "nice post" }
我需要變成這個(gè)樣子:
wangaimin> db.test.find({"name" : "bob"}) { "_id" : ObjectId("58e4b6410b8bd344936c8553"), "name" : "bob", "comments" : { "email" : "bob@email.com.cn", "content" : "nice post" } }
操作步驟是:
wangaimin> var Test=db.test.findOne({"name":"bob"}) Test.comments={"email":Test.email,"content":Test.content} delete Test.content delete Test.email db.test.update({"name" : "bob"},Test) 其實(shí)這個(gè)地方有一個(gè)坑,就是_id,如果你匹配中有多個(gè)name="bob",你就會(huì)報(bào)錯(cuò),_id必須是唯一的,所以可以也可以執(zhí)行delete Test._id,這里沒有寫的很詳細(xì),大家可以仔細(xì)想一下,如果不想是沒有記憶點(diǎn)
使用修改器:
1,$set修改器
修改之前: wangaimin> db.test.find({"name" : "bob"}) { "_id" : ObjectId("58e4b6410b8bd344936c8553"), "name" : "bob", "comments" : { "email" : "bob@email.com.cn", "content" : "nice post" } } 命令:db.test.update({"name" : "bob"},{$set:{"name":"BOB"}}) 修改之后: wangaimin> db.test.find({"name" : "BOB"}) { "_id" : ObjectId("58e4b6410b8bd344936c8553"), "name" : "BOB", "comments" : { "email" : "bob@email.com.cn", "content" : "nice post" } } 修改內(nèi)嵌文檔: 命令:wangaimin> db.test.update({"name" : "BOB"},{$set:{"comments.content":"change le"}}) 修改之后: wangaimin> db.test.find({"name" : "BOB"}) { "_id" : ObjectId("58e4b6410b8bd344936c8553"), "name" : "BOB", "comments" : { "email" : "bob@email.com.cn", "content" : "change le" } }
2,$inc 增加和減少 注意:$inc 鍵的值必須是數(shù)字,不能為字符串,數(shù)組或其他非數(shù)字的值 db.test.find() { "_id" : ObjectId("58e4bb4b0b8bd344936c8554"), "number" : 10 } wangaimin> db.test.update({"number":10},{$inc:{"number":3}}) wangaimin> db.test.find() { "_id" : ObjectId("58e4bb4b0b8bd344936c8554"), "number" : 13 }
3,$push添加數(shù)組
如果數(shù)組已經(jīng)存在,$push會(huì)向已有的數(shù)組末尾加入一個(gè)元素,要是沒有就創(chuàng)建一個(gè)新的數(shù)組
db.test.find() { "_id" : ObjectId("58e4bd5f0b8bd344936c8555"), "school" : "bd" } db.test.update({"school":"bd"},{$push,{"list":{"name":"zhangsan","age":20}}}) db.test.find() { "_id" : ObjectId("58e4bd5f0b8bd344936c8555"), "school" : "bd", "list" : [ { "name" : "zhangsan", "age" : 20 } ] }
4,使用$each添加多個(gè)值
db.test.update({"school":"bd"},{$push:{"list":{$each:[{"name":"zhangsan","age":21},{"name":"zhangsan","age":22},{"name":"zhangsan","age":23},{"name":"zhangsan","age":24}]}}}) { "_id" : ObjectId("58e4bd5f0b8bd344936c8555"), "school" : "bd", "list" : [ { "name" : "zhangsan", "age" : 20 }, { "name" : "zhangsan", "age" : 21 }, { "name" : "zhangsan", "age" : 22 }, { "name" : "zhangsan", "age" : 23 }, { "name" : "zhangsan", "age" : 24 } ] }
5,使用$slice限制個(gè)數(shù),必須使用$each
使用$slice限制數(shù)組長(zhǎng)度,如果$slice:-10,如果數(shù)組的長(zhǎng)度小于10($push之后),那么所以的元素都會(huì)保留,如果數(shù)組的元素大于10,只有最后10個(gè)元素會(huì)報(bào)錯(cuò),重點(diǎn)$slice的值必須是負(fù)數(shù)
wangaimin> db.test.find({"name":"test"}) { "_id" : ObjectId("58e4c1d30b8bd344936c8556"), "name" : "test", "id" : [ 1, 2, 3, 4, 5, 7, 7, 1, 2, 3, 4, 5, 5 ] } wangaimin> db.test.update({"name":"test"},{$push:{"id":{$each:[1,2,3],$slice:-5}}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) wangaimin> db.test.find({"name":"test"}) { "_id" : ObjectId("58e4c1d30b8bd344936c8556"), "name" : "test", "id" : [ 5, 5, 1, 2, 3 ] }
6,將數(shù)組作為數(shù)據(jù)集使用($ne,$addToSet)
因?yàn)閿?shù)組的元素是可以重復(fù)的,設(shè)置這個(gè)就是讓數(shù)組的元素不可以重復(fù)