Om du använder meteorhackaggregatet
paket för att implementera en .aggregate()
kommandot på din samling, så returnerar den bara en array som svar. Så du måste arbeta det till en form av en publicerad samling:
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();
});
Eller för att inkludera false
räknas som din föreslagna utdata antyder sig själv:
{ "$group": {
"_id": "$userId",
"progressState": { "$first": true },
"count": { "$sum": { "$cond": ["$progressState", 1,0] }
}},
{ "$sort": { "_id": 1 } }
Som pipeline med en $cond
utvärdering för att konvertera till numerisk.
Där i den grundläggande sammanställningen du bara "totalar" de matchade resultaten och naturligtvis $sort
hänvisar till ett fält som finns i utgången, som i ditt exempel skulle vara värdet "userId" nu i _id
nyckel från aggregering, men kan också "räknas" efter beställning efter det totala antalet om så önskas.
Den delen skapade felet, som $sort
är ett aktuellt fält och inte ett fältvärde med $
notation.
Men för att publicera som en klienttillgänglig samling måste du naturligtvis ersätta det faktiska _id
med något förväntat. Så slumpmässig id-generering fungerar här, liksom inkluderingen av de andra fälten.
För lite mer detaljer, och även ett alternativ till "hacks"-paketet som bara fungerar med en vaniljinstallation, finns det också det här svaret av mig själv som har en komplett lista som exempel.