MongoDB如何在$map条目添加sum字段且无需罗列所有属性
解决方案:用
$mergeObjects合并原属性与新增字段 当然有更优雅的实现方式!你完全不用手动罗列所有已有属性,借助MongoDB的$mergeObjects操作符,就能在保留数组元素原有所有字段的基础上,轻松新增sum属性。
完整聚合查询代码
db.items.aggregate([ { $project: { values: { $map: { input: "$values", as: "v", in: { $mergeObjects: [ "$$v", // 直接保留原数组元素的全部属性 { sum: { $add: ["$$v.number1", "$$v.number2"] } } // 新增sum计算字段 ] } } } } } ])
代码逻辑说明
$mergeObjects的作用是将多个对象合并为一个,这里我们把原数组元素($$v)和包含sum的新对象合并,既保留了所有原有属性,又添加了新字段。- 这种方式的好处是完全不需要关心原数组元素有哪些字段,就算后续新增其他属性,这个查询也能自动适配,不用修改代码。
执行后的预期结果
运行上述查询后,会得到你想要的输出:
{ "values": [ { "number1": 5, "number2": 6, "anotherProp": "...", "anotherProp2": "...", "sum": 11 }, { "number1": 8, "number2": 1, "anotherProp": "...", "anotherProp2": "...", "sum": 9 } ] }
另外你提到尝试$addFields没得到理想结果,是因为$addFields默认是给顶级文档添加字段,而这里需要操作数组内部的每个元素,所以结合$map和$mergeObjects才是正确的处理方式哦。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

