Запрос вложенных документов MongoDB без массивов - PullRequest
0 голосов
/ 16 сентября 2018

В этом документе «27» и «28» являются днями месяца, в то время как «6» - «11» под «27» представляют часы дня

{
        "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 голосов
/ 16 сентября 2018

Вы можете попробовать ниже агрегации

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
      }
    ]
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...