Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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 如何在子文档中添加计算字段而不使用展开?_Mongodb_Aggregation Framework - Fatal编程技术网

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
    获取子数组的总数
  • $ifNull
    检查字段是否不存在或是否为null,然后返回空数组,因为$size运算符只允许数组输入
  • $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", []] }
                }
              }
            ]
          }
        }
      }
    }
  }
])