MongoDB乾貨篇之更新數據

  • 2019 年 12 月 31 日
  • 筆記

文章目錄

  1. 1. MongoDB乾貨篇之數據更新
    1. 1.1. 常用的函數
      1. 1.1.1. upsert
      2. 1.1.2. multi
    2. 1.2. 字段更新操作符 Field Update Operators
      1. 1.2.1. $set
      2. 1.2.2. $unset
      3. 1.2.3. $inc
      4. 1.2.4. $rename
    3. 1.3. 數組更新操作符 Array Update Operators
      1. 1.3.1. $ (query)
      2. 1.3.2. $push
      3. 1.3.3. $pull

MongoDB乾貨篇之數據更新

常用的函數

  • update(<query>,<update>,<upsert>,<multi>),其中<query>表示篩選的條件,<update>是要更新的數據
  • updateMany() 更新所有匹配到的數據

upsert

upsert是一個布爾類型的數據,如果為true時,當根據query條件沒有找到匹配的數據時,就表示插入此條數據,如果為false就表示不插入數據 下面將會在一個空的集合中更新數據

//就會插入此條數據,因為沒有找到匹配的信息  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

如果這個參數為true,就把按條件查出來多條記錄全部更新。默認為false,如果為true的話和updateMany()一樣的效果 下面將會更新所有匹配到的數據

db.user.update({name:'chenjiabing'},{$set:{'hobby':'code'}},{'multi':true});

字段更新操作符 Field Update Operators

$set

$set用來指定一個鍵的值。如果這個鍵不存在,則創建它。注意這裡的更新默認是只更新第一條匹配到的數據,如果第一條匹配的數據已經滿足修改後的條件,那麼將不會執行下面匹配的信息

  • 下面我們將會添加一條信息在數據庫中
db.user.insert({"name":'jack',"age":22,"sex":'Man','school':{'name':'jsnu','city':'xuzhou'}});

運行下面的代碼,將該用戶的興趣設置為「讀書」並添加至文檔中(此時文檔中hobby鍵是不存在,該條文檔就會創建它)

	db.user.update({name:'jack'},{$set:{'hobby':'read'}})

下面將會修改用戶的年齡

	db.user.update({'name':'jack'},{$set:{'age':20}})

下面用$set修改數據類型,將sex設置為1

db.user.update({'name':'jack'},{$set:{'sex':1}})

下面用$set修改內嵌文檔,必須指定文檔的名字和鍵值

db.user.update({name:'jack'},{$set:{'school.name':'shida','school.city':'beijing'}})

$unset

從文檔中移除指定的鍵 下面將要刪除上面插入的hobby

	db.user.update({name:'jack'},{$unset:{'hobby':1}})   //這裡的值是任意給的,隨便什麼值

$inc

$inc修改器用來增加已有鍵的值,或者在鍵不存在時創建一個鍵$inc就是專門來增加(和減少)數字的。$inc只能用於整數、長整數或雙精度浮點數。要是用在其他類型的數據上就會導致操作失敗 例如毎次有人訪問該博文,該條博文的瀏覽數就加1,用鍵pageViews保存瀏覽數信息。這個鍵值上面沒有定義過,所以會自動創建一個

	db.user.update({name:'jack'},{$inc:{'pageViews':1}});    //起初沒有就會自動創建一個鍵

下面演示增加和減少

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操作符可以重命名字段名稱,新的字段名稱不能和文檔中現有的字段名相同。 下面重新插入一條數據,並且改變這條數據的鍵的名稱

db.user.insert({name:'chenjiabing','age':22,'sex':'Man','school':{'name':'jsnu','city':'beijing'}});  db.user.update({name:'chenjiabing'},{$rename:{'age':'Age'}})   //重命名age為Age

下面將要演示怎樣改變內嵌文檔的鍵的名稱,注意一定要帶上文檔的名字

db.user.update({name:'chenjiabing'},{$rename:{'school.name':'school.Name','school.city':'school.City'}});

如果重命名的字段字和集合中原有的字段名字相同的話就會覆蓋原有的字段名稱,那麼就會造成數據的丟失

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不存在,那麼就會創建一個  //輸出  { "_id" : ObjectId("590674ce30b9f88dd43d7ee4"), "name" : "chenjiabing", "age" : "Man", "school" : { "city" : "beijing" }, "contact" : { "name" : "jsnu" } }

數組更新操作符 Array Update Operators

只能用在鍵值為數組的鍵上的數組操作。

$ (query)

語法:{ "<array>.$" : value } 當對數組字段進行更新時,且沒有明確指定的元素在數組中的位置,我們使用定位操作符$標識一個元素,數字都是以0開始的。 注意:

  • 定位操作符(「$」)作為第一個匹配查詢條件的元素的佔位符,也就是在數組中的索引值。
  • 數組字段必須出現查詢文檔中。

向集合中插入兩條數據

db.students.insert({ "_id" : 1, "grades" : [ 78, 88, 88 ] });  db.students.insert({ "_id" : 2, "grades" : [ 88, 90, 92 ] });

執行下列操作

//查詢匹配的文檔中,數組有2個88,只更新第一個匹配的元素,也就是"grades.1"  db.students.update( { _id: 1, grades: 88 }, { $set: { "grades.$" : 82 } }) ;  //查詢文檔中沒有出現grades字段,查詢報錯  db.students.update( { _id: 2 }, { $set: { "grades.$" : 82 } } );

$push

如果指定的鍵已經存在,會向已有的數組末尾加入一個元素,要是沒有就會創建一個新的數組。 下面我們將使用$push對該文檔添加一條評論信息。

//將會創建一個comments數組,因為一開始這個數組沒有存在  db.user.update({name:'chenjiabing'},{$push:{comments:{'name':'jack','content':'hello thanks'}}})  //繼續添加一條,在comments的末尾進行添加,此時comments變成兩條數據了  db.user.update({name:'chenjiabing'},{$push:{comments:{'name':'john','content':'hello'}}})

$pull

語法db.collection.update( { field: <query> }, { $pull: { field: <query> } } ); $pull操作符移除指定字段值為數組,且匹配$pull操作符移除指定字段值為數組,且匹配$pull語句聲明的查詢條件的所有元素。 執行如下操作

//插入一條文檔  db.profiles.insert({ votes: [ 3, 5, 6, 7, 7, 8 ] });  //移除數組中所有元素7  db.profiles.update( { votes: 3 }, { $pull: { votes: 7 } } );  //移除數組中所有大於6的元素  db.profiles.update( { votes: 3 }, { $pull: { votes: { $gt: 6 } } } );  //Result  { votes: [ 3, 5, 6, 8 ] }  { votes: [ 3, 5, 6 ] }