Для того, чтобы условно совместить совпадения на этапе трубопровода $group
, вам необходимо использовать $cond
operator.
Тестовые данные настройки:
db.people.insert([
{name:"George", grade:5, school:"MathHighSchool"},
{name:"John", grade:4, school:"MathHighSchool"},
{name:"Paul", grade:3, school:"MathHighSchool"},
{name:"Ringo", grade:5, school:"MathHighSchool"},
{name:"Johnny", grade:2, school:"MathHighSchool"},
{name:"Joshua", grade:7, school:"MathHighSchool"},
])
Предполагая, что вы просто хотите отсчеты, вот пример агрегации (протестировано с MongoDB 2.4.8):
db.people.aggregate(
{ $match: {
school : 'MathHighSchool'
}},
{ $group: {
_id: "$school",
// Add up matches less than grade 3
low: { $sum: { $cond: [ {$lt: ["$grade", 3] }, 1, 0] }},
// Add up matches between 3 and 5 (inclusive)
medium: { $sum: { $cond:[
{ $and: [ {$gte: ["$grade", 3]}, {$lte: ["$grade", 5]} ] }, 1, 0]
}},
// Add up matches greater than grade 5
high: { $sum: { $cond: [ {$gt: ["$grade", 5] }, 1, 0] }},
}}
)
Результат:
{
"result" : [
{
"_id" : "MathHighSchool",
"low" : 1,
"medium" : 4,
"high" : 1
}
],
"ok" : 1
}
[Что вы сделали?] (Https://www.google.de/search?q=mongodb+group) – Philipp
Ух, что вы имеете в виду? Я пробовал как 2 часа или около того. – user3108836
{$ group: {_ id: "$ grade", low: {$ lt: 3}, medium: {$ и: [{lte: 5}, {gte: 3}], high: {gt: 5}} }}) что-то вроде этого, но doesn; t work – user3108836