MongoDB Aggregate-计算对象内所有嵌套数组元素的总数

时间:2020-10-18 00:17:15

标签: mongodb mongoose aggregation-framework

我有一个包含以下对象的数据库结构:

"reactions": {
    "?": [
        "5f3c569e70441a0017511fe2",
        "5f88d49dbf1b850017e28f4e",
        "5f488189b0c5970017aa8c7a"
    ],
    "?": [
        "5f539086cfb52a00176089ed"
    ]
}

我希望能够计算“反应数”(所有嵌套元素的总数)-因此,在这种情况下,预期结果将为4。

我尝试了以下操作,这成功地计算了键的数量-结果为2,而不是值的总数-应该为4。

db.collection("posts").aggregate([{
    {
        $addFields: {
            reactionsArray: {
                $objectToArray: "$reactions"
            }
        }
    },
    {
        $addFields: {
            numberOfReactions: {
                $sum: {
                    $size: "$reactionsArray.v"
                }
            }
        }
    }
])

2 个答案:

答案 0 :(得分:2)

使用$reduce对数组中每个元素的大小求和。

db.collection.aggregate([
  {
    $addFields: {
      reactionsArray: {
        $objectToArray: "$reactions"
      }
    }
  },
  {
    "$project": {
      reactionsSize: {
        $reduce: {
          input: "$reactionsArray",
          initialValue: 0,
          in: {
            "$add": [
              "$$value",
              {
                $size: "$$this.v"
              }
            ]
          }
        }
      },
      
    },
    
  }
])

MongoDB Playground

答案 1 :(得分:1)

您必须先$ {unwind reactionsArray,然后使用$ group来获取总数

db.collection.aggregate([
  {
    $addFields: {
      reactionsArray: {
        $objectToArray: "$reactions"
      }
    }
  },
  {
    $unwind: "$reactionsArray"
  },
  {
    $group: {
      _id:"$_id",
      numberOfReactions: {
        $sum: {
          $size: "$reactionsArray.v"
        }
      }
    }
  }
])

MongoDB Playground