将两个MongoDB聚合管道合并为一个管道

3
我有一份人口普查的集合,但我仍然不熟悉“aggregate”函数,无法通过一次查询获得结果。该集合的格式如此处所示(加上ISO 8601时间戳)。这样,每次进行人口普查时,我们就可以记录当前年龄和人数(可以添加/修改/删除以前的年龄)。现在我有两个“aggregate”查询返回以下内容
  1. 获取DB中所有注册表的平均值、最大值和最小值。
  2. 获取每个年龄并显示该年龄的人数总和(“sum”)。
然而,我需要通过一个“aggregate”查询获得这些结果,但是管道对我来说有些困难,我无法获取统计数据,然后“展开”人口普查以获得总和...请问如何合并这两个查询?谢谢您提前的帮助!
1个回答

4

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

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的总和,这样我就可以显示在哪个时间戳/文档中注册了最多的人数。无论如何,再次感谢!!! - Miguel
1
@Miguel 不用担心 :-) 很高兴你至少从中得到了一些想法,可以帮助解决你的问题。 - chridam
最后一个问题:你是如何构建这些查询的?我的意思是,是逐步构建还是完全构建然后测试?直接在mondoDB shell中进行,还是使用更有用的应用程序?正如你所看到的,我仍在学习这些大型查询... :) - Miguel
1
@Miguel 我个人的做法是在每个管道阶段运行聚合查询,测试每个步骤的结果是否相符。例如,在上面的聚合中,我首先运行 db.collection('population').aggregate([{ "$unwind": "$population" }]);,检查结果以查看是否正确解构 population 数组,添加下一个管道阶段,运行并重复这些步骤,直到到达最终管道阶段。我使用 Robomongo 0.8.4 进行此操作。一旦您获得了工作的聚合管道,就可以将代码部署到生产环境中。 - chridam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接