【问题标题】:Querying nested MongoDB documents without arrays查询没有数组的嵌套 MongoDB 文档
【发布时间】:2019-02-20 14:30:21
【问题描述】:

在本文档中,“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]}

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

什么是聪明和优化的方式来做到这一点?

【问题讨论】:

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


    【解决方案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
          }
        ]
      }
    ]
    

    【讨论】:

    • 谢谢!如果我想在一个数组中获得基于小时的聚合,那么它做到了?
    • 感谢您的宝贵时间。
    • 谢谢安东尼!
    猜你喜欢
    • 2019-10-09
    • 1970-01-01
    • 2021-11-12
    • 2021-02-25
    • 2016-08-16
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多