嵌套數組更新
插入內嵌數組
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}});
|