Группа запросов MongoDB и отдельные вместе

Рассмотрим следующий пакет документов:

[
  {
    "name" : "nameA",
    "class" : "classA",
    "age" : 24,
    "marks" : 45
  },
  {
    "name" : "nameB",
    "class" : "classB",
    "age" : 22,
    "marks" : 65
  },
  {
    "name" : "nameC",
    "class" : "classA",
    "age" : 14,
    "marks" : 55
  }
]

Мне нужно получить минимальное и максимальное значения для возраста и оценок, а также различные значения для имени и класса.

Я знаю, что могу использовать агрегат и группу, чтобы получить максимальное и минимальное значения возраста и отметок с помощью одного запроса, и я могу получить разные значения имени и класса, используя отдельный запрос.

Но я не хочу делать отдельные запросы для получения этой информации. Есть ли способ получить результат с помощью одного запроса? Скажем, могу ли я каким-то образом объединить совокупность и различие.


person Sambhav Sharma    schedule 21.06.2014    source источник


Ответы (1)


Конечно, вы можете сделать это с помощью одной команды агрегации. Вам нужно использовать $group с оператором $addToSet:

db.collection.aggregate([{ 
    $group : {
        _id : null,
        name : { $addToSet : "$name" },
        class : { $addToSet : "$class" },
        ageMin : { $min : "$age" },
        ageMax : { $max : "$age" },
        marksMin : { $min : "$marks" },
        marksMax : { $max : "$marks" }
    }
}]);

$addToSet создаст массив с уникальными значениями для выбранного поля.

Эта агрегация вернет следующий ответ для ваших примеров документов:

{
    "_id" : null,
    "name" : [
        "nameC",
        "nameB",
        "nameA"
    ],
    "class" : [
        "classB",
        "classA"
    ],
    "ageMin" : 14,
    "ageMax" : 24,
    "marksMin" : 45,
    "marksMax" : 65
}
person Christian P    schedule 21.06.2014