2015-05-20 3 views
1

Эй им пытаются некоторые агрегацию на MongoDB используя moongose: Я получил эти данные:Aggregation с MongoDB используя мангуста

[ 
    { 
    "school": "1", 
    "preferences": [ 
     { 
     "person": "X", 
     "color": "A" 
     }, 
     { 
     "person": "X", 
     "color": "B" 
     }, 
     { 
     "person": "Y", 
     "color": "A" 
     } 
    ] 
    }, 
    { 
    "school": "2", 
    "preferences": [ 
     { 
     "person": "Z", 
     "color": "A" 
     }, 
     { 
     "person": "Y", 
     "color": "C" 
     } 
    ] 
    } 
] 

Я думаю, что данные explaisn это сам, что я хочу, чтобы получить как результат, когда Я запрашиваю школу, которая соответствует «1». Я хотел бы получить этот результат:

[ 
    { 
    "_id": "X", 
    "colors": [ 
     "A", 
     "B" 
    ] 
    }, 
    { 
    "_id": "Y", 
    "colors": ["A"] 
    } 
] 

Я использовал агрегацию раньше, но я не могу фигурировать, чтобы получить этот результат.

ответ

0

Проверить это агрегация запрос:

db.collectionName.aggregate({ 
    "$match": { 
    "school": "1" 
    } 
}, { 
    "$unwind": "$preferences" 
}, { 
    "$group": { 
    "_id": "$preferences.person", 
    "colors": { 
     "$addToSet": "$preferences.color" // $addToSet used here only to add distinct color 
    } 
    } 
}) 

Редактировать Если вы хотите подсчитать количество color затем использовали группу с sum, как показано ниже:

db.collectionName.aggregate({ 
    "$match": { 
    "school": "1" 
    } 
}, { 
    "$unwind": "$preferences" 
}, { 
    "$group": { 
    "_id": "$preferences.color", 
    "appears": { 
     "$sum": 1 
    } 
    } 
}) 

EDIT

В соответствии с вашим новое требование, которое вы должны выполнить после агрегации:

db.collectionName.aggregate({ 
    "$unwind": "$preferences" 
}, 
{ 
    "$group": { 
     "_id": { 
      "person": "$preferences.person", 
      "color": "$preferences.color" 
     }, 
     "count": { 
      "$sum": 1 
     } 
    } 
}, 
{ 
    "$group": { 
     "_id": "$_id.person", 
     "colors": { 
      "$push": { 
       "color": "$_id.color", 
       "count": "$count" 
      } 
     } 
    } 
}, 
{ 
    "$project": { 
     "_id": 0, 
     "person": "$_id", 
     "colors": 1 
    } 
}).pretty() 
+1

Эй, человек, спасибо, я не могу поверить, что я пытался это сделать с трудом и был так прост, я использовал совпадение с идентификатором, человеком проекта: $ preferences.person, цвет: $ preferences.color, раскрутить человека , group_id: person, colors: $ addToSet: $ color и не заставил его работать, всегда получал человека, но каждый цвет повторялся в каждом человеке. –

+0

А что, если я хотел бы получить снова школьных матчей "1" '' ' [ { "_id": "А", // Цвет появляется значок "": 2 // в 2 человек } , { "_id": "B", "появляется" : 1 } ] '' ' @yogesh –

+0

По вашему запросу вы первый проецировать их как' { "$ проекта": { "лицо" : «$ preferences.person», «color»: «$ preferences.color»}} 'поэтому этот возвращаемый массив' person и color' как этот '' человек ': ["X", "X", "Y "]," color ": [" A "," B "," A "]' и после этого вы использовали 'unwind to person'' {"$ unwind": "$ person"} 'он только разматывает' человека' массив не является ' color' array выглядит так: «человек»: «X», «color»: [«A», «B», «A»] 'после группы« person », а затем вы использовали' addToSet как цвет', поэтому цвет содержит массив массивов вроде этого '' _id ":" Y "," color ": [[" A "," B "," A "]]'. – Yogesh