簡體   English   中英

MongoDB:根據另一個元素的存在更新數組的一個元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM