子文档中多个字段的总和

时间:2015-12-05 13:20:22

标签: mongodb aggregation-framework

我使用了以下链接中建议的架构: https://docs.mongodb.org/ecosystem/use-cases/pre-aggregated-reports/

以下是示例文档。键每小时延长0到23小时,0到59分钟。由于预分配的可能性,某些密钥可能会丢失。

{
  "page": "abc",
  "minute": {
    "0": {
      "0": 1,
      "1": 2,
      "2": 4,
      "3": 1,
      "4": 6
    },
    "1": {
      "0": 2,
      "1": 4,
      "2": 1,
      "3": 3,
      "4": 0
    },
    "2": {
      "0": 1,
      "1": 2,
      "2": 2,
      "3": 1,
      "4": 50
    },
    "3": {
      "0": 6,
      "1": 0,
      "2": 0,
      "3": 0,
      "4": 1
    }
  }
}

我想计算从每分钟2.30到分钟3.3的访问总和。

1 个答案:

答案 0 :(得分:0)

我可以使用聚合框架的“$ project”阶段来完成它。我使用“$ add”和“$ ifNull”运算符的组合。运算符“$ ifNull”用于处理文档中不存在子文档的键的场景。

{
  "$project": {
    "_id": 0,
    "page": 1,
    "number": {
      "$add": [
        { "$ifNull": [ "$minute.2.30", 0 ] },
        { "$ifNull": [ "$minute.2.31", 0 ] },
        { "$ifNull": [ "$minute.2.32", 0 ] },
        { "$ifNull": [ "$minute.2.33", 0 ] },
        { "$ifNull": [ "$minute.2.34", 0 ] },
        { "$ifNull": [ "$minute.2.35", 0 ] },
        { "$ifNull": [ "$minute.2.36", 0 ] },
        { "$ifNull": [ "$minute.2.37", 0 ] },
        { "$ifNull": [ "$minute.2.38", 0 ] },
        { "$ifNull": [ "$minute.2.39", 0 ] },
        { "$ifNull": [ "$minute.2.40", 0 ] },
        { "$ifNull": [ "$minute.2.41", 0 ] },
        { "$ifNull": [ "$minute.2.42", 0 ] },
        { "$ifNull": [ "$minute.2.43", 0 ] },
        { "$ifNull": [ "$minute.2.44", 0 ] },
        { "$ifNull": [ "$minute.2.45", 0 ] },
        { "$ifNull": [ "$minute.2.46", 0 ] },
        { "$ifNull": [ "$minute.2.47", 0 ] },
        { "$ifNull": [ "$minute.2.48", 0 ] },
        { "$ifNull": [ "$minute.2.49", 0 ] },
        { "$ifNull": [ "$minute.2.50", 0 ] },
        { "$ifNull": [ "$minute.2.51", 0 ] },
        { "$ifNull": [ "$minute.2.52", 0 ] },
        { "$ifNull": [ "$minute.2.53", 0 ] },
        { "$ifNull": [ "$minute.2.54", 0 ] },
        { "$ifNull": [ "$minute.2.55", 0 ] },
        { "$ifNull": [ "$minute.2.56", 0 ] },
        { "$ifNull": [ "$minute.2.57", 0 ] },
        { "$ifNull": [ "$minute.2.58", 0 ] },
        { "$ifNull": [ "$minute.2.59", 0 ] },
        { "$ifNull": [ "$minute.3.0", 0 ] },
        { "$ifNull": [ "$minute.3.1", 0 ] },
        { "$ifNull": [ "$minute.3.2", 0 ] },
        { "$ifNull": [ "$minute.3.3", 0 ] },
        { "$ifNull": [ "$minute.3.4", 0 ] },
        { "$ifNull": [ "$minute.3.5", 0 ] },
        { "$ifNull": [ "$minute.3.6", 0 ] },
        { "$ifNull": [ "$minute.3.7", 0 ] },
        { "$ifNull": [ "$minute.3.8", 0 ] },
        { "$ifNull": [ "$minute.3.9", 0 ] },
        { "$ifNull": [ "$minute.3.10", 0 ] },
        { "$ifNull": [ "$minute.3.11", 0 ] },
        { "$ifNull": [ "$minute.3.12", 0 ] },
        { "$ifNull": [ "$minute.3.13", 0 ] },
        { "$ifNull": [ "$minute.3.14", 0 ] },
        { "$ifNull": [ "$minute.3.15", 0 ] }
      ]
    }
  }
}