Mongodb 查询没有数组的嵌套字段

Mongodb 查询没有数组的嵌套字段,mongodb,nosql,mongodb-query,aggregation-framework,pymongo,Mongodb,Nosql,Mongodb Query,Aggregation Framework,Pymongo,对于下面的文档“27”和“28”是当月的天数,而“27”下的“6”到“11”表示小时,我希望能够检索每个小时的用户数组,以便使用python进行一些处理,或者理想情况下捕获一整天的用户数组,但是,如果我可以每小时访问一次用户,那么我可以使用python来完成这项工作 { "values" : { "27" : { "6" : { "use

对于下面的文档“27”和“28”是当月的天数,而“27”下的“6”到“11”表示小时,我希望能够检索每个小时的用户数组,以便使用python进行一些处理,或者理想情况下捕获一整天的用户数组,但是,如果我可以每小时访问一次用户,那么我可以使用python来完成这项工作

{
        "values" : {
                "27" : {
                        "6" : {
                                "users" : [
                                        "5b5abc5ddd601f0b6681358a"
                                ],
                                "values" : {
                                        "5b5abc5ddd601f0b6681358a" : 2
                                }
                        },
                        "7" : {
                                "users" : [
                                        "5b5ac75cdd601f0b668157ff",
                                        "5b5acd0ddd601f0b66816803"
                                ],
                                "values" : {
                                        "5b5ac75cdd601f0b668157ff" : 1,
                                        "5b5acd0ddd601f0b66816803" : 4
                                }
                        },
                        "8" : {
                                "users" : [
                                        "5b5acd0ddd601f0b66816803"
                                ],
                                "values" : {
                                        "5b5acd0ddd601f0b66816803" : 2
                                }
                        },
                        "9" : {
                                "users" : [
                                        "5b5acd0ddd601f0b66816803",
                                        "5b5ae89b781e011702f00812"
                                ],
                                "values" : {
                                        "5b5acd0ddd601f0b66816803" : 2,
                                        "5b5ae89b781e011702f00812" : 3
                                }
                        },
                        "10" : {
                                "users" : [
                                        "5b5ae89b781e011702f00812"
                                ],
                                "values" : {
                                        "5b5ae89b781e011702f00812" : 1
                                }
                        }
                },
                "28" : {
                        "11" : {
                                "users" : [
                                        "5b5abacadd601f0b6681312e"
                                ],
                                "values" : {
                                        "5b5abacadd601f0b6681312e" : 1
                                }
                        }
                }
        }
}
这是因为这里没有数组,所以解绑不起作用,而且有些日子和小时没有活动,所以没有可用的数据。

您需要使用动态键名。然后,您可以结合应用来展平您的数据模型,并以天为键获得结果:

db.col.aggregate([
    {
        $project: {
            days: {
                $map: {
                    input: { $objectToArray: "$values" },
                    as: "day",
                    in: {
                        k: "$$day.k",
                        v: {
                            $map: { 
                                input: { $objectToArray: "$$day.v" },
                                as: "h",
                                in: {
                                    $map: {
                                        input: { $objectToArray: "$$h.v.values" },
                                        as: "pair",
                                        in: "$$pair.k"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    {
        $project: {
            days: {
                $arrayToObject: {
                    $map: {
                        input: "$days",
                        as: "day",
                        in: {
                            k: "$$day.k",
                            v: {
                                $reduce: {
                                    input: "$$day.v",
                                    initialValue: [],
                                    in: { $concatArrays: [ "$$this", "$$value" ] }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
])
印刷品:

{
    "days" : {
            "27" : [
                    "5b5ae89b781e011702f00812",
                    "5b5acd0ddd601f0b66816803",
                    "5b5ae89b781e011702f00812",
                    "5b5acd0ddd601f0b66816803",
                    "5b5ac75cdd601f0b668157ff",
                    "5b5acd0ddd601f0b66816803",
                    "5b5abc5ddd601f0b6681358a"
            ],
            "28" : [
                    "5b5abacadd601f0b6681312e"
            ]
    }
}

此模型的预期输出是什么?我的意思是,您希望如何使用MongoDB转换粘贴的文档?希望它成为{day:[用户]}{“27”:[“5b5abc5ddd601f0b6681358a”,“5b5ac75cdd601f0b668157ff”,“5BACD0DDD601F0B66816803”,“5BACD0DDD601F0B66816803”,“5BACD0DDD601F0B66816803”,“5BAE89781E011702F000812”,“5BAE89781EB11702F012”]}{“28”:[“5B5ABACAD601F0B6681312E”]先生,你是个天才!非常感谢。