您好,登錄后才能下訂單哦!
今天看書看到mongodb權威指南這本書對update這一篇進行了詳細詳解,因為知識點有點多,所以博客記錄一下,如果只是看我覺得明天就忘了。
更新文檔有兩種方式:
1,文檔替換 2,修改器替換(只是修改單個字段的內容)
關于update有哪些參數可以看一下幫助文檔
db> db.blog.update function (query, obj, upsert, multi) query:條件 obj:對象,更新的類容 upsert:判斷更新的條件是否存在 multi:默認情況下更新只對符合匹配條件的第一個文檔執行操作,要是這個為true,就是配置內容所以都更新
文檔替換
當前的數據類型是
wangaimin> db.test.findOne({"name":"bob"}) { "_id" : ObjectId("58e4b6410b8bd344936c8553"), "name" : "bob", "email" : "bob@email.com.cn", "content" : "nice post" }
我需要變成這個樣子:
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) 其實這個地方有一個坑,就是_id,如果你匹配中有多個name="bob",你就會報錯,_id必須是唯一的,所以可以也可以執行delete Test._id,這里沒有寫的很詳細,大家可以仔細想一下,如果不想是沒有記憶點
使用修改器:
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" } } 修改內嵌文檔: 命令: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 鍵的值必須是數字,不能為字符串,數組或其他非數字的值 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添加數組
如果數組已經存在,$push會向已有的數組末尾加入一個元素,要是沒有就創建一個新的數組
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添加多個值
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限制個數,必須使用$each
使用$slice限制數組長度,如果$slice:-10,如果數組的長度小于10($push之后),那么所以的元素都會保留,如果數組的元素大于10,只有最后10個元素會報錯,重點$slice的值必須是負數
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,將數組作為數據集使用($ne,$addToSet)
因為數組的元素是可以重復的,設置這個就是讓數組的元素不可以重復
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。