【问题标题】:Merge two MongoDB aggregates into one pipeline将两个 MongoDB 聚合合并到一个管道中
【发布时间】:2017-07-02 15:08:32
【问题描述】:

我有一组人口普查,但我仍然没有支配“聚合”功能,只需一个查询即可获得结果。

该集合具有 this format(加上 ISO 8601 时间戳)。这样,每次进行人口普查时,我们都可以注册当前的年龄和计数(可以添加/修改/删除以前的年龄)。

现在我有两个“聚合”查询to return this

  1. Get the AVG, MAX, MIN of all the registries in the DB.
  2. Get each age and show a total (“sum”) of people with that age.

但是,我只需要通过一个“聚合”查询来获得这些结果,但管道对我来说有些困难,我无法获得统计数据,然后“展开”总体以获得总和......

关于如何合并这两个查询的任何帮助,好吗?提前谢谢大家!

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    试试下面的聚合管道,它应该会给你两个查询的结果:

    db.collection('population').aggregate([
        {
            "$unwind": "$population"
        },
        {
            "$group": {
                "_id": 0,
                "doc": {
                    "$push": "$$ROOT"
                },
                "average_age": {
                    "$avg": "$population.age"
                },
                "max_age": {
                    "$max": "$population.age"
                },
                "min_age": {
                    "$min": "$population.age"
                },
                "average_population": {
                    "$avg": "$population.count"
                },
                "max_population": {
                    "$max": "$population.count"
                },
                "min_population": {
                    "$min": "$population.count"
                }
            }
        },
        {
            "$unwind": "$doc"
        },
        {
            "$group": {
                "_id": "$doc.population.age",
                "sum": { "$sum": "$doc.population.count" },
                "average_age": { "$first": "$average_age"},
                "max_age": { "$first": "$max_age"},
                "min_age": { "$first": "$min_age"},
                "average_population": { "$first": "$average_population"},
                "max_population": { "$first": "$max_population"},
                "min_population": { "$first": "$min_population"}
            }
        }
    ])
    

    【讨论】:

    • 谢谢,@chridam!确实如此!我必须稍微玩一下,所以max_population 不是每个文档中的最大年龄,而是每个文档的population.counts$sum,所以我可以显示哪个时间戳/文档的人数最多挂号的。无论如何,再次感谢!!!!
    • @Miguel 不用担心 :-) 很高兴您至少从中获得了一些有助于解决您的疑问的想法。
    • 最后一个问题:您如何构建这些查询?我的意思是,分阶段进行,还是完全构建然后进行测试?直接在 mondoDB shell 中,还是在任何更有用的应用程序中?如您所见,我仍在学习这些大查询... :)
    • @Miguel 我个人所做的是在每个管道阶段运行聚合查询,测试每个步骤的结果是否相符。例如,在上面的聚合中,我首先运行 db.collection('population').aggregate([ { "$unwind": "$population" }]); ,检查结果以查看 population 数组是否正确解构,添加下一个管道阶段,运行并重复这些步骤,直到到达最终管道步。我为此使用Robomongo 0.8.4。一旦你得到一个有效的聚合管道,你就可以将代码部署到生产环境中。
    猜你喜欢
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 2018-07-07
    • 2021-04-19
    相关资源
    最近更新 更多