Ако използвате aggregate meteor hacks
пакет за внедряване на .aggregate()
команда на вашата колекция, тогава тя просто ще върне масив в отговор. Така че трябва да обработите това във форма на публикувана колекция:
Meteor.publish("completedLB,function() {
var self = this;
var results = userCompleted.aggregate([
{ "$match": { "progressState": true } },
{ "$group": {
"_id": "$userId",
"progressState": { "$first": "$progressState" },
"count": { "$sum": 1 }
}},
{ "$sort": { "_id": 1 } }
]);
_.each(results,function(result) {
self.added("client_collection_name",Random.id(), {
userId: result._id,
progressState: result.progressState,
count: result.count
});
});
self.ready();
});
Или да включите false
се брои, тъй като вашият предложен изход се предлага сам:
{ "$group": {
"_id": "$userId",
"progressState": { "$first": true },
"count": { "$sum": { "$cond": ["$progressState", 1,0] }
}},
{ "$sort": { "_id": 1 } }
Като конвейер с $cond
оценка за преобразуване в числова.
Където в основното агрегиране вие просто „сумирате“ съответстващите резултати и разбира се $sort
се отнася до поле, присъстващо в изхода, което според вашия пример би било стойността „userId“ сега в _id
ключ от агрегиране, но може също да бъде "брой", за да се подреди по общия брой, ако желаете.
Тази част създаваше грешката като $sort
е настоящо поле, а не стойност на поле с $
нотация.
Но, разбира се, за да публикувате като колекция, достъпна за клиента, трябва да замените действителния _id
с нещо очаквано. Така че произволното генериране на идентификатор работи тук, както и включването на другите полета.
За малко повече подробности, а също и алтернатива на пакета "hacks", който работи само с ванилова инсталация, има също този отговор от мен, който има пълен списък като пример.