2015-04-26 2 views
1

У меня есть коллекция переписи населения, и я до сих пор не доминирую над функцией «aggregate», чтобы получить результаты только с одним запросом.Объединить два агрегата MongoDB в один конвейер

В коллекции 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.

Однако мне нужно, чтобы получить эти результаты с помощью всего один «совокупного» запроса, но трубопровод мне несколько сложно, и я не могу получить статистику, а затем «раскрутить» население, чтобы получить суммы ...

Любая помощь по объединению этих двух запросов, пожалуйста? Спасибо всем заранее!

ответ

2

Попробуйте следующий агрегацию трубопровод, он должен дать вам результат двух запросов:

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"} 
     } 
    } 
]) 
+0

Спасибо, @chridam! Оно делает! Мне нужно немного поиграть с ним, поэтому 'max_population' не максимальный возраст в каждом документе, а' $ sum' из 'population.counts' каждого документа, поэтому я могу показать, на какой временной отметке/документе больше всего числа людей. В любом случае, еще раз спасибо !!!! – Miguel

+1

@Miguel Не стоит беспокоиться :-) Рад, что у вас есть хоть какие-то идеи из этого, которые помогут решить ваши вопросы. – chridam

+0

Последний вопрос: как вы строите эти запросы? Я имею в виду, поэтапно, или полностью его строю, а затем тестирование? Непосредственно в оболочке mondoDB или в любом другом полезном приложении? Как вы видите, я все еще участвую в этих больших запросах ... :) – Miguel

Смежные вопросы