Jeśli używasz agregatu Meteor hacks
pakiet do implementacji .aggregate()
polecenie w swojej kolekcji, to w odpowiedzi zwróci tylko tablicę. Musisz więc przerobić to na formę opublikowanej kolekcji:
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();
});
Lub dołączyć false
liczy się tak, jak sugeruje sugerowany wynik:
{ "$group": {
"_id": "$userId",
"progressState": { "$first": true },
"count": { "$sum": { "$cond": ["$progressState", 1,0] }
}},
{ "$sort": { "_id": 1 } }
Jako potok z $cond
ocena do konwersji na numeryczną.
Gdzie w podstawowej agregacji po prostu „podliczasz” dopasowane wyniki i oczywiście $sort
odnosi się do pola obecnego w danych wyjściowych, które według twojego przykładu byłoby wartością „userId” teraz w _id
klucz z agregacji, ale w razie potrzeby może być również „zliczany” w kolejności według łącznej liczby.
Ta część powodowała błąd, jako $sort
jest bieżącym polem, a nie wartością pola z $
notacja.
Ale oczywiście, aby opublikować jako kolekcję dostępną dla klienta, musisz zastąpić rzeczywisty _id
z czymś oczekiwanym. Tak więc działa tutaj losowe generowanie identyfikatorów, podobnie jak włączanie innych pól.
Aby uzyskać więcej szczegółów, a także alternatywę dla pakietu „hacks”, który działa tylko z instalacją waniliową, istnieje również ta odpowiedź przeze mnie, który ma pełną listę jako przykład.