2016-06-15 2 views
2

у меня есть документы, которые имеют category поля в виде массива строк, какPopulate Количества уникальных элементов в массиве на основе полей во всех документах

{ name: "aaa", categories: ["apple","banana","peach"] }, 
{ name: "bbb", categories: ["apple","orange" }, 
{ name: "ccc", categories: ["apple","peach"] } 
... 

В результате мне нужно иметь и массив объектов, имеющие агрегированные значения каждое уникальное значение из категории и количества появлений этой категории, как это:

[ 
    { category: "apple", qty: 3 }, 
    { category: "banana", qty: 1 }, 
    { category: "peach", qty: 2 }, 
    { category: "orange", qty: 1 } 
] 

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

SomeCollection.native(function(err, collection) { 
    collection.aggregate([ 
     { $group: { _id: "$categories", name: { $addToSet: "$categories._type" } } }, 
     { $unwind: "$categories" }, 
     { $group : { _id : "$categories", count: { $sum : 1 } } } 
    ], function(error, result) { 
     sails.log.info('result:', result); 
    }); 
}); 

Где я ошибаюсь?

ответ

1

Это возвращает пустой результат, потому что ваш первый шаг трубопровода является $group конвейера операции, которая, по существу, группировки всех документов в вашей коллекции с помощью categories массива, в то же время вы добавляете в массив в том, что perculiar group тип массива. Пустой результат следует при применении оператора в $unwind на несуществующее поле массива (потому что предыдущий $group трубопроводный оператор не производит новую categories поля, только ключи _id и name).

Вы хотели бы в первую очередь придавить categories массив, так что он будет генерировать новую запись для каждого элемента поля категории данных, на которую наносится $unwind. Теперь вы можете применить $group операцию, чтобы получить желаемый результат:

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

SomeCollection.native(function(err, collection) { 
    collection.aggregate([ 
     { $unwind: "$categories" }, 
     { $group: { _id: "$categories", qty: { $sum : 1 } } } 
    ], function(error, result) { 
     sails.log.info('result:', result); 
    }); 
}); 
Смежные вопросы