MongoDB:基于同一对象上的其他字段,向数组中的所有对象添加字段?

时间:2020-12-21 13:05:02

标签: mongodb

我对 MongoDB 相当陌生,似乎无法找到解决此问题的方法。 我有一个具有这种结构的文档数据库:

   {
      id: 1 
      elements: [ {elementId: 1, nr1: 1, nr2: 3}, {elementId:2, nr1:5, nr2: 10} ]
   }

我正在寻找一个查询,该查询可以向 nr3 数组中的所有对象添加一个值 nr2/nr1,例如 elements,以便生成的文档看起来像这样:

  {
      id: 1 
      elements: [ {elementId: 1, nr1: 1, nr2: 3, nr3:3}, {elementId:2, nr1:5, nr2: 10, nr3: 2} ]
   }

所以我想象一个这样的查询:

db.collection.updateOne({id:1}, {$set:{"elements.$[].nr3": nr2/nr1}})

但我找不到如何获取数组中同一对象的 nr2nr1 的值。 我在 stackoverflow 上发现了一些类似的问题,指出这是不可能的,但他们已经有 5 年以上的历史了,所以我想他们可能已经添加了对此类内容的支持。

我意识到我可以通过首先查询文档并在此过程中迭代元素数组进行更新来实现这一点,但为了学习的目的,我很想看看是否可以在一个查询中做到这一点。

>

2 个答案:

答案 0 :(得分:1)

您可以从 MongoDB v4.2 开始使用 update with aggregation pipeline

  • $map 迭代元素循环
  • 使用 nr1 将 nr2 与 $divide 相除
  • 使用 nr3 合并当前对象和新字段 $mergeObjects
db.collection.updateOne(
  { id: 1 }, 
  [{
    $set: {
      elements: {
        $map: {
          input: "$elements",
          in: {
            $mergeObjects: [
              "$$this",
              { nr3: { $divide: ["$$this.nr2", "$$this.nr1"] } }
            ]
          }
        }
      }
    }
  }]
)

Playground

答案 1 :(得分:0)

db.collection.update(
  { id:1},
  { "$set": { "elements.$[elem].nr3":elements.$[elem].nr2/elements.$[elem].nr1} },
  { "multi": true }
);

我想这应该可行