Mongodb 如何在子文档中添加计算字段而不使用展开?
我正在寻找一个简单的解决方案,在不使用Mongodb 如何在子文档中添加计算字段而不使用展开?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我正在寻找一个简单的解决方案,在不使用$unwind和$group的情况下将字段添加到子文档中。 我只需要计算嵌套子文档的总和和大小,并将其显示在新字段中。 这是我的开始收藏: { "_id": ObjectId("5a934e000102030405000000"), "subDoc": [ { "a": 1, "subArray": [1,2,3]
$unwind
和$group
的情况下将字段添加到子文档中。
我只需要计算嵌套子文档的总和和大小,并将其显示在新字段中。
这是我的开始收藏:
{
"_id": ObjectId("5a934e000102030405000000"),
"subDoc": [
{
"a": 1,
"subArray": [1,2,3]
},
{
"b": 2
}
]
},
{
"_id": ObjectId("5a934e000102030405000001"),
"subDoc": [
{
"a": 1,
"subArray": [4,5,6]
},
{
"b": 2
},
{
"c": 3,
"subArray": [8,8,8]
}
]
}
这是我想要的结果,我添加了sum
(子数组的和)和size
(子数组中的元素数):
我知道如何使用$unwind
然后使用$group
获得此结果,但我想知道是否有其他方法(或更好的方法!)达到相同的结果。我尝试过使用$addFields
和$map
但没有成功
工作操场示例:
迭代$map
子文档的循环
获取子数组的总数$sum
检查字段是否不存在或是否为null,然后返回空数组,因为$size运算符只允许数组输入$ifNull
获取$size
子数组中的元素总数
将当前对象与新添加的字段合并$mergeObjects
{
"_id": ObjectId("5a934e000102030405000000"),
"subDoc": [
{
"a": 1,
"subArray": [1,2,3],
"sum": 6,
"size": 3
},
{
"b": 2
"sum": 0,
"size": 0
}
]
},
{
"_id": ObjectId("5a934e000102030405000001"),
"subDoc": [
{
"a": 1,
"subArray": [4,5,6],
"sum": 15,
"size": 3
},
{
"b": 2,
"sum": 0,
"size": 0
},
{
"c": 3,
"subArray": [8,8],
"sum": 16,
"size": 2
}
]
}
db.collection.aggregate([
{
$addFields: {
subDoc: {
$map: {
input: "$subDoc",
in: {
$mergeObjects: [
"$$this",
{
sum: { $sum: "$$this.subArray" },
size: {
$size: { $ifNull: ["$$this.subArray", []] }
}
}
]
}
}
}
}
}
])