我对 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}})
但我找不到如何获取数组中同一对象的 nr2
和 nr1
的值。
我在 stackoverflow 上发现了一些类似的问题,指出这是不可能的,但他们已经有 5 年以上的历史了,所以我想他们可能已经添加了对此类内容的支持。
我意识到我可以通过首先查询文档并在此过程中迭代元素数组进行更新来实现这一点,但为了学习的目的,我很想看看是否可以在一个查询中做到这一点。
>答案 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"] } }
]
}
}
}
}
}]
)
答案 1 :(得分:0)
db.collection.update(
{ id:1},
{ "$set": { "elements.$[elem].nr3":elements.$[elem].nr2/elements.$[elem].nr1} },
{ "multi": true }
);
我想这应该可行