[英]MongoDB: Update one element of an array based on the presence of another
我的數據上有一個數組字段。 我想查找該數組中具有特定兩個值的所有文檔,並更新兩個之一。 我認為我需要$
來執行此操作,但是我對如何更新正確的元素感到困惑。 為了使其更具挑戰性,數組的元素是文檔,而不是簡單的值。
到目前為止,我有
db.getCollection('Submissions').update(
{
"data": {$elemMatch:{
label:"Level 2",
value: {$ne: ""}}},
"data": {$elemMatch:{
label:"Level"
}}
},{})
在該查詢中使用find可以得到正確的文檔,現在我要從標簽為“ Level”的元素中更新元素並將其值設置為2。這讓我很困惑。
您不能直接使用$
。 它引用第一個匹配的子文檔,並且您至少有兩個匹配的子文檔。
您需要在應用程序級別執行此操作。 選擇文檔ID,然后按ID更新:
db.getCollection('Submissions').find(
{
"data": {$elemMatch:{
label:"Level 2",
value: {$ne: ""}}},
"data": {$elemMatch:{
label:"Level"
}}
},{_id:1});
db.getCollection('Submissions').update(
{
"_id": "_id from previous query",
"data": {$elemMatch:{
label:"Level"
}}
},{ $set: { "data.$.value": 2} })
或者,您可以將第二個匹配項移至$ where函數,以僅保留一個應與子文檔匹配的$elemMatch
進行更新:
db.getCollection('Submissions').update(
{
"data": {$elemMatch:{ label:"Level"} },
$where: function() {
return obj.data.filter(
el => el.label == "Level 2" && el.value != ""
).length >= 1
},
},{ $set: { "data.$.value": 2} })
不過,它很慢。 我沒有對其進行基准測試,但是我認為第一種方法應該更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.