【问题标题】:MongoDB Aggregate - Calculate total number of all nested array elements within an objectMongoDB Aggregate - 计算对象内所有嵌套数组元素的总数
【发布时间】:2020-10-19 01:04:58
【问题描述】:

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

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

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

我尝试了以下方法,这成功计算了键的数量 - 结果是 2,但不是值的总数 - 应该是 4。

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

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案1】:

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

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

    MongoDB Playground

    【讨论】:

      【解决方案2】:

      你必须 $unwind reactionsArray 然后使用 $group 来获取总数

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

      MongoDB Playground

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-11
        • 2021-10-14
        • 1970-01-01
        • 2018-07-25
        • 1970-01-01
        相关资源
        最近更新 更多