前言
數(shù)據(jù)更新是我們?nèi)粘2僮鲾?shù)據(jù)庫必不可少的一部分,下面這篇文章就給大家分享了操作MongoDB數(shù)據(jù)更新的一些干貨,對大家具有一定的參考學習價值,一起來學習學習吧。
常用的函數(shù)
update(query>,update>,upsert>,multi>)
,其中query>表示篩選的條件,update>是要更新的數(shù)據(jù)
updateMany()
更新所有匹配到的數(shù)據(jù)
upsert
upsert是一個布爾類型的數(shù)據(jù),如果為true時,當根據(jù)query條件沒有找到匹配的數(shù)據(jù)時,就表示插入此條數(shù)據(jù),如果為false就表示不插入數(shù)據(jù)
下面將會在一個空的集合中更新數(shù)據(jù)
//就會插入此條數(shù)據(jù),因為沒有找到匹配的信息
db.user.update({'name':'chenjiabing','age':22,'sex':"Man"},{$set:{'hobby':'read'}},{'upsert':true});
db.user.update({'name':'chenjiabing','age':22,'sex':"Man"},{$set:{'hobby':'read'}},true); //和上面的語句等價
//輸出 db.user.find()
{ "_id" : ObjectId("59067b70856d5893a687655f"), "age" : 22, "name" : "chenjiabing", "sex" : "Man", "hobby" : "read" }
multi
如果這個參數(shù)為true,就把按條件查出來多條記錄全部更新。默認為false,如果為true的話和updateMany()
一樣的效果
下面將會更新所有匹配到的數(shù)據(jù)
db.user.update({name:'chenjiabing'},{$set:{'hobby':'code'}},{'multi':true});
字段更新操作符 Field Update Operators
$set
$set
用來指定一個鍵的值。如果這個鍵不存在,則創(chuàng)建它。注意這里的更新默認是只更新第一條匹配到的數(shù)據(jù),如果第一條匹配的數(shù)據(jù)已經(jīng)滿足修改后的條件,那么將不會執(zhí)行下面匹配的信息
下面我們將會添加一條信息在數(shù)據(jù)庫中
db.user.insert({"name":'jack',"age":22,"sex":'Man','school':{'name':'jsnu','city':'xuzhou'}});
運行下面的代碼,將該用戶的興趣設置為“讀書”并添加至文檔中(此時文檔中hobby鍵是不存在,該條文檔就會創(chuàng)建它)
db.user.update({name:'jack'},{$set:{'hobby':'read'}})
下面將會修改用戶的年齡
db.user.update({'name':'jack'},{$set:{'age':20}})
下面用$set修改數(shù)據(jù)類型,將sex設置為1
db.user.update({'name':'jack'},{$set:{'sex':1}})
下面用$set修改內(nèi)嵌文檔,必須指定文檔的名字和鍵值
db.user.update({name:'jack'},{$set:{'school.name':'shida','school.city':'beijing'}})
$unset
從文檔中移除指定的鍵
下面將要刪除上面插入的hobby鍵
db.user.update({name:'jack'},{$unset:{'hobby':1}}) //這里的值是任意給的,隨便什么值
$inc
$inc
修改器用來增加已有鍵的值,或者在鍵不存在時創(chuàng)建一個鍵$inc
就是專門來增加(和減少)數(shù)字的。$inc
只能用于整數(shù)、長整數(shù)或雙精度浮點數(shù)。要是用在其他類型的數(shù)據(jù)上就會導致操作失敗
例如毎次有人訪問該博文,該條博文的瀏覽數(shù)就加1,用鍵pageViews保存瀏覽數(shù)信息。這個鍵值上面沒有定義過,所以會自動創(chuàng)建一個
db.user.update({name:'jack'},{$inc:{'pageViews':1}}); //起初沒有就會自動創(chuàng)建一個鍵
下面演示增加和減少
db.user.update({name:'jack'},{$inc:{'pageViews':100}}) ; //這里是在上面的基礎上加上100,此時變成了101
db.user.update({name:'jack'},{$inc:{"pageViews":-100}}) ; //這里是在上面的基礎上減去100,此時還是變成了1
$rename
語法: {$rename: { old name1>: new name1>, old name2>: new name2>, ... } }
$rename
操作符可以重命名字段名稱,新的字段名稱不能和文檔中現(xiàn)有的字段名相同。
下面重新插入一條數(shù)據(jù),并且改變這條數(shù)據(jù)的鍵的名稱
db.user.insert({name:'chenjiabing','age':22,'sex':'Man','school':{'name':'jsnu','city':'beijing'}});
db.user.update({name:'chenjiabing'},{$rename:{'age':'Age'}}) //重命名age為Age
下面將要演示怎樣改變內(nèi)嵌文檔的鍵的名稱,注意一定要帶上文檔的名字
db.user.update({name:'chenjiabing'},{$rename:{'school.name':'school.Name','school.city':'school.City'}});
如果重命名的字段字和集合中原有的字段名字相同的話就會覆蓋原有的字段名稱,那么就會造成數(shù)據(jù)的丟失
db.user.update({name:'chenjiabing'},{'$rename':{'sex','age'}}); //這里sex變成age和原來的age相同,那么原來的age就會丟失
db.user.find({name:'chenjiabing'});
//輸出,可以看到原來的age沒有了,變成了覆蓋之后的
{ "_id" : ObjectId("590674ce30b9f88dd43d7ee4"), "name" : "chenjiabing", "age" : "Man", "school" : { "name" : "jsnu", "city" : "beijing" } }
如果指定的字段不存在,那么將不會更新,對原來的字段沒有影響
db.user.update({name:'chenjiabing'},{$rename:{value:'name'}}); //將不會有任何的改變,因為value這個字段根本不存在
$rename
操作符也可以將子文檔中鍵值移到其他子文檔中
db.user.update({name:'chenjiabing'},{$rename:{'school.name':'contact.name'}});// 這里將會將school.name這個字段的值移到contact.name之中,如果contact不存在,那么就會創(chuàng)建一個
//輸出
{ "_id" : ObjectId("590674ce30b9f88dd43d7ee4"), "name" : "chenjiabing", "age" : "Man", "school" : { "city" : "beijing" }, "contact" : { "name" : "jsnu" } }
數(shù)組更新操作符 Array Update Operators
只能用在鍵值為數(shù)組的鍵上的數(shù)組操作。
$ (query)
語法: { "array>.$" : value }
當對數(shù)組字段進行更新時,且沒有明確指定的元素在數(shù)組中的位置,我們使用定位操作符$標識一個元素,數(shù)字都是以0開始的。
注意:
- 定位操作符(“$”)作為第一個匹配查詢條件的元素的占位符,也就是在數(shù)組中的索引值。
- 數(shù)組字段必須出現(xiàn)查詢文檔中。
向集合中插入兩條數(shù)據(jù)
db.students.insert({ "_id" : 1, "grades" : [ 78, 88, 88 ] });
db.students.insert({ "_id" : 2, "grades" : [ 88, 90, 92 ] });
執(zhí)行下列操作
//查詢匹配的文檔中,數(shù)組有2個88,只更新第一個匹配的元素,也就是"grades.1"
db.students.update( { _id: 1, grades: 88 }, { $set: { "grades.$" : 82 } }) ;
//查詢文檔中沒有出現(xiàn)grades字段,查詢報錯
db.students.update( { _id: 2 }, { $set: { "grades.$" : 82 } } );
$push
如果指定的鍵已經(jīng)存在,會向已有的數(shù)組末尾加入一個元素,要是沒有就會創(chuàng)建一個新的數(shù)組。
下面我們將使用$push
對該文檔添加一條評論信息。
//將會創(chuàng)建一個comments數(shù)組,因為一開始這個數(shù)組沒有存在
db.user.update({name:'chenjiabing'},{$push:{comments:{'name':'jack','content':'hello thanks'}}})
//繼續(xù)添加一條,在comments的末尾進行添加,此時comments變成兩條數(shù)據(jù)了
db.user.update({name:'chenjiabing'},{$push:{comments:{'name':'john','content':'hello'}}})
$pull
語法:db.collection.update( { field: query> }, { $pull: { field: query> } } );
$pull
操作符移除指定字段值為數(shù)組,且匹配$pull操作符移除指定字段值為數(shù)組,且匹配$pull語句聲明的查詢條件的所有元素。
執(zhí)行如下操作
//插入一條文檔
db.profiles.insert({ votes: [ 3, 5, 6, 7, 7, 8 ] });
//移除數(shù)組中所有元素7
db.profiles.update( { votes: 3 }, { $pull: { votes: 7 } } );
//移除數(shù)組中所有大于6的元素
db.profiles.update( { votes: 3 }, { $pull: { votes: { $gt: 6 } } } );
//Result
{ votes: [ 3, 5, 6, 8 ] }
{ votes: [ 3, 5, 6 ] }
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
您可能感興趣的文章:- MongoDB數(shù)據(jù)庫插入、更新和刪除操作詳解
- MongoDB插入、更新、刪除文檔實現(xiàn)代碼
- MongoDB的創(chuàng)建、更新和刪除