MongoDB更新修改內嵌文檔操作


嵌套數組更新

插入內嵌數組

db.storage.insertMany( [
   { name: "Storage Alpha", items: [ { category: "food",name:"apple" }, {category:"food",name:"banana"},{category:"tool",name:"hammer"},{category:"furniture",name:"couch"}]},
]);

 

以下面的數據(數據集名稱為author)為例:

1
{name: '島上碼農' , documents: [ 'Flutter入門與實戰' , '高性能MySQL' , 'MongoDB專業指北' ]}

我們需要將 MongoDB專業指北改成MongoDB不專業指北,就屬於修改嵌套的文檔數據了。這個時候需要使用到 MongoDB 提供的定位操作符$。定位操作符即表示將對應條件匹配到的數據,如:

1
2
3
4
db.author.update(
   {name: '島上碼農' , documents: 'MongoDB專業指北' },
   { '$set' : { 'documents.$' : 'MongoDB不專業指北' }}
);

對於下級節點為數組的也是一樣。

1
2
3
4
5
6
7
8
{
   name: '島上碼農' ,
   documents: [
     {name: 'Flutter入門與實戰' , score: 80},
     {name: '高性能MySQL' , score: 90},
     {name: 'MongoDB專業指北' , score: 85}
   ]
}

需要將 documengs 節點的 name 和 score 進行修改。

1
2
3
4
5
6
7
db.author.update(
   {name: '島上碼農' , 'documents.name' : 'MongoDB專業指北' },
   { '$set' : {
         'documents.$.name' : 'MongoDB不專業指北' ,
         'documents.$.score' :88}
   }
);

$定位操作符即在查詢條件中找到的數組中的數據元素位置,即表示操作的是該位置的數據。

更新下級文檔的屬性

更新下級文檔屬性時可以直接使用屬性訪問符“.”,例如下面需要更新 praise 增加到291。

1
2
3
4
5
6
7
8
{
   name: '島上碼農' ,
   scores: {
     view:  18800,
     praise: 290,
     followers: 105
     }
}
1
2
3
4
db.author.update(
   {name: '島上碼農' },
   { '$set' : { 'scores.praise' : 291}}
);

下級文檔若還存在嵌套數組也是類似的操作,如下面的數據,需要將“公眾號”換成“微信公眾號”:

1
2
3
4
5
6
7
8
9
{
   name: '島上碼農' ,
   scores: {
     view:  18800,
     praise: 290,
     followers: 105,
     platform: [ '掘金' , '公眾號' ]
     }
}
1
2
3
4
db.author.update(
   { 'name' : '島上碼農' , 'scores.platform' : '公眾號' },
   { '$set' : { 'scores.platform.$' : '微信公眾號' }}
);

屬性增加和移除

MongoDB提供了 $push 和 $pull操作指令來增加或移除屬性,同時還提供了 $pop 來移除數組的第一個或最后一個值。我們給前一個文檔增加一個 homepage 屬性。

1
2
3
4
db.author.update(
   {name: '島上碼農' },
   {$push: {homepage: 'https://juejin.cn/user/70787819648695' }}
);

還可以使用$addToSet對內嵌的對象數組進行處理

  

> db.author.updateOne(

  {"chapter":"test"},

  {"$addToSet":{"finalWords":{"word":"abcde","desc":"abcde"}}}

)

 

注意的是,此時插入的是一個名為 homepage 的數組,其中的一個元素是:juejin.cn/user/707878…。如果是增加不是數組的屬性,使用$set 指令即可。 可以使用 pull 移除掉匹配的一個屬性。

1
2
3
4
db.author.update(
   {name: '島上碼農' },
   {$pull: {homepage: 'https://juejin.cn/user/70787819648695' }}
);
 db.guest.updateOne(
  {"chapter":"test"},
  {"$pull":{"emails":{"word":"abcde"}}}
)

$pop 操作時使用數字-1和1表示移除首尾的元素,對於下面的數據,移除數組platform里的數據。

1
2
3
4
5
6
7
8
9
{
   name: '島上碼農' ,
     scores : {
         view: 18800,
         praise: 290,
         followers: 105,
         platform: [ '掘金' , '公眾號' , '其他1' , '其他2' ]
     }
}
 
1
2
3
4
// 移除第一個元素
db.author.update({name: '島上碼農' }, {$pop: { 'scores.platform' : -1}});
// 移除最后一個元素
db.author.update({name: '島上碼農' }, {$pop: { 'scores.platform' : 1}});

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM