查询没有数组的嵌套MongoDB文档

时间:2018-09-16 13:28:55

标签: mongodb mongoose nosql mongodb-query aggregation-framework

在本文档中,“ 27”和“ 28”是一个月中的几天,而“ 27”下的“ 6”至“ 11”代表一天中的小时数

{
        "values" : {
                "27" : {
                        "6" : {
                                "users" : [
                                        "5b5abc5ddd601f0b6681358a"
                                ]
                        },
                        "7" : {
                                "users" : [
                                        "5b5ac75cdd601f0b668157ff",
                                        "5b5acd0ddd601f0b66816803"
                                ]
                        },
                        "8" : {
                                "users" : [
                                        "5b5acd0ddd601f0b66816803"
                                ]
                        },
                        "9" : {
                                "users" : [
                                        "5b5acd0ddd601f0b66816803",
                                        "5b5ae89b781e011702f00812"
                                ]
                        },
                        "10" : {
                                "users" : [
                                        "5b5ae89b781e011702f00812"
                                ]
                        }
                },
                "28" : {
                        "11" : {
                                "users" : [
                                        "5b5abacadd601f0b6681312e"
                                ]
                        }
                }
        }
}

我希望能够以两种方式查询它 首先作为{day: users-count} 例如:

{"27" : 7,
"28" : 1 }

,其他方式为{day : {hour : users-count}示例:

{"27" : ["6" : 1,
        "7" : 2,
        "8" : 1,
        "9" : 2,
        "10": 1],

 "28" : ["11" :1]}

将其用于预测和时间序列分析。

什么是明智且优化的方法?

1 个答案:

答案 0 :(得分:1)

您可以尝试以下汇总

db.collection.aggregate([
  { "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": {
        "$map": {
          "input": {
            "$map": {
              "input": { "$objectToArray": "$values" },
              "as": "val",
              "in": { "k": "$$val.k", "v": { "$objectToArray": "$$val.v" }}
            }
          },
          "as": "val",
          "in": {
            "k": "$$val.k",
            "v": {
              "$sum": {
                "$map": {
                  "input": "$$val.v",
                  "as": "v2",
                  "in": { "$size": "$$v2.v.users" }
                }
              }
            }
          }
        }
      }
    }
  }}
])

输出

[
  {
    "27": 7,
    "28": 1
  }
]

第二个输出

db.collection.aggregate([
  { "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": {
        "$map": {
          "input": {
            "$map": {
              "input": { "$objectToArray": "$values" },
              "as": "val",
              "in": { "k": "$$val.k", "v": { "$objectToArray": "$$val.v" }}
            }
          },
          "as": "val",
          "in": {
            "k": "$$val.k",
            "v": {
              "$arrayToObject": {
                "$map": {
                  "input": "$$val.v",
                  "as": "v2",
                  "in": { "k": "$$v2.k", "v": { "$size": "$$v2.v.users" }}
                }
              }
            }
          }
        }
      }
    }
  }}
])

输出

[
  {
    "27": {
      "10": 1,
      "6": 1,
      "7": 2,
      "8": 1,
      "9": 2
    },
    "28": {
      "11": 1
    }
  }
]

另一个

db.collection.aggregate([
  { "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": {
        "$map": {
          "input": {
            "$map": {
              "input": { "$objectToArray": "$values" },
              "as": "val",
              "in": {
                "k": "$$val.k",
                "v": { "$objectToArray": "$$val.v" }
              }
            }
          },
          "as": "val",
          "in": {
            "k": "$$val.k",
            "v": [
              { "$arrayToObject": {
                "$map": {
                  "input": "$$val.v",
                  "as": "v2",
                  "in": { "k": "$$v2.k", "v": { "$size": "$$v2.v.users" }}
                }
              }}
            ]
          }
        }
      }
    }
  }}
])

输出

[
  {
    "27": [
      {
        "10": 1,
        "6": 1,
        "7": 2,
        "8": 1,
        "9": 2
      }
    ],
    "28": [
      {
        "11": 1
      }
    ]
  }
]