首页 > 解决方案 > Mongodb 从文档上的多个数组更新元素

问题描述

我想从位于 MongoDB 集合文档的多个列表中的对象更新属性。

在 MongoDB 集合中,我有这样的文档:

{
    "firstArray": [
        {
        "name": "john",
        "updated": false // I wanna switch that to true
        },
        {
        "name": "bob",
        "updated": false
        }
    ],
    "secondArray": [
        {
        "name": "eric",
        "updated": false
        },
        {
        "name": "john",
        "updated": false // I wanna switch that to true
        }
    ]
}

"name":"john"我的目标是使用from 文档的属性firstArraysecondArrayto更新每个元素updated:true

由于它们可以是对文档的并行访问,因此我将只使用更新运算符(一种读取和替换方法,这样会增加丢弃另一个进程所做更改的风险)

看起来该问题中提到的过滤位置运算符 $[]是从文档的数组更新对象属性的方法,它似乎不支持多个具有相同运算符使用两个运算符(一个由数组)在两个不同的$set$set

由于此 mongo shell 命令仅更新secondArray

    db['collection'].update(
    {},
    {
        "$set": { "firstArray.$[elem].updated": true },
        "$set": { "secondArray.$[elem].updated": true }
    },
    { "arrayFilters": [{ "elem.name": "john" }], "multi": true })

这个命令返回The array filter for identifier 'a' was not used in the update { $set: { secondArray.$[b].updated: true } }

    db['collection'].update(
    {},
    {
        "$set": { "firstArray.$[a].updated": true },
        "$set": { "secondArray.$[b].updated": true }
    },
    { "arrayFilters": [{ "a.name": "john" }, { "b.name": "john" }], "multi": true })

那么,您知道如何进行更新吗?(有关上述限制的任何文档引用的奖励点)

谢谢!

标签: mongodbmongodb-query

解决方案


对象中该函数的第二个参数。一个给定的字段名在一个对象中只能有一个值。为了显示发送到服务器的内容,我将您使用的值分配给了一个变量:

> var o={    
     "$set": { "firstArray.$[a].updated": true },         
     "$set": { "secondArray.$[b].updated": true }     
}; 
> printjson(o)
{ "$set" : { "secondArray.$[b].updated" : true } }

如您所见,第一个值被第二个覆盖,因为两个字段都命名为$set.

尝试将它们组合成一个字段:

{
  "$set": { 
           "firstArray.$[elem].updated": true,
            "secondArray.$[elem].updated": true 
  }
}

推荐阅读