Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Mongo db 4.2:将数组项的字段替换为匹配文档的另一个字段的值_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb Mongo db 4.2:将数组项的字段替换为匹配文档的另一个字段的值

Mongodb Mongo db 4.2:将数组项的字段替换为匹配文档的另一个字段的值,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,考虑包含以下文档的mongo集合: { name: "Enrico", age: 32, items: [{ type: "cat", color: "blue" }, { type: "dog", color: "red" }]}, { name: "Francesca", age: 33, items: [{ type: "foo", color: &q

考虑包含以下文档的mongo集合:

{ name: "Enrico", age: 32, items: [{ type: "cat", color: "blue" }, { type: "dog", color: "red" }]},
{ name: "Francesca", age: 33, items: [{ type: "foo", color: "bar" }, { type: "hello", color: "world" }]},
{ name: "Mario", age: 40, items: [{ type: "cat", color: "green" }, { type: "dog", color: "white" }]}
我需要通过更改匹配数组项的
color
属性的值来更新
items
数组包含
cat
的所有文档。
color
属性的新值必须等于匹配文档的
name
字段的值

预期结果如下:

{ name: "Enrico", age: 32, items: [{ type: "cat", color: "Enrico" }, { type: "dog", color: "red" }]},
{ name: "Francesca", age: 33, items: [{ type: "foo", color: "bar" }, { type: "hello", color: "world" }]},
{ name: "Mario", age: 40, items: [{ type: "cat", color: "Mario" }, { type: "dog", color: "white" }]}
通过使用,通过将匹配数组项的
color
属性替换为静态值,执行类似的更新非常容易。例如,以下更新将用
“更改的颜色”
字符串文字替换匹配数组项的
color
属性:

db.people.updateMany(
    {"items.type": "cat"},
    {$set: {"items.$.color": "changed-color"}}
)
这里的问题是,我想使用匹配文档的另一个字段的值(
name
)作为匹配数组项的
color
属性的新值

我知道,由于MongoDB 4.2,可以在更新查询中使用聚合管道,如文档所述。通过使用,可以将文档字段替换为同一文档的另一个值

因此,我尝试将 使用,我最终得到以下查询:

db.people.updateMany(
    {"items.type": "cat"},
    [
        {$set: {"items.$.color": "$name"}}
    ]
)
不幸的是,此查询不起作用:mongo db抱怨
$set
阶段无效,因为
$
符号不能在字段路径内使用。聚合框架似乎不知道数组的
$
更新操作符

是否可以使用查询执行我想要的更新?我应该选择脚本吗?

你可以试试

  • $map
    要迭代项数组的循环,请检查
    类型
    是否为
    cat
    的条件,然后从
    $name
    返回
    颜色
    ,并使用
    $mergeObjects
    合并对象

db.people.updateMany(
  { "items.type": "cat" },
  [{
    $set: {
      items: {
        $map: {
          input: "$items",
          in: {
            $mergeObjects: [
              "$$this",
              {
                $cond: [
                  { $eq: ["$$this.type", "cat"] },
                  { color: "$name" },
                  {}
                ]
              }
            ]
          }
        }
      }
    }
  }]
)