2013-12-16 1 views
0

У меня есть этот тип документов:агрегация трубопровода MongoDB

collection:People 
{name:"George", grade:5, school:"MathHighSchool"} 

и многие другие примеры. мне нужен запрос, который находит все человек, которые: исследование в MathHighSchool (так мы имеем db.people.aggregate({$match:{school:"MathHighSchool"}},....)

и затем сгруппировать их по их сортам, так как он показывает число людей с классом числом людей, с класс от 3 до 5 и количество людей со степенью> 5. Любые идеи?

+1

[Что вы сделали?] (Https://www.google.de/search?q=mongodb+group) – Philipp

+0

Ух, что вы имеете в виду? Я пробовал как 2 часа или около того. – user3108836

+0

{$ group: {_ id: "$ grade", low: {$ lt: 3}, medium: {$ и: [{lte: 5}, {gte: 3}], high: {gt: 5}} }}) что-то вроде этого, но doesn; t work – user3108836

ответ

4

Для того, чтобы условно совместить совпадения на этапе трубопровода $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 
} 
+1

Чувак, ты классный! – user3108836