Hvis du bruger meteor hacks-aggregatet
pakke til at implementere en .aggregate()
kommando på din samling, så returnerer den kun lige et array som svar. Så du skal arbejde det til en form for en offentliggjort 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 for at inkludere false
tæller som dit foreslåede output antyder sig selv:
{ "$group": {
"_id": "$userId",
"progressState": { "$first": true },
"count": { "$sum": { "$cond": ["$progressState", 1,0] }
}},
{ "$sort": { "_id": 1 } }
Som pipeline med en $cond
evaluering for at konvertere til numerisk.
Hvor du i den grundlæggende aggregering bare "totaler" de matchede resultater og selvfølgelig $sort
refererer til et felt til stede i outputtet, som i dit eksempel ville være "userId"-værdien nu i _id
nøgle fra aggregering, men kunne også "tælles" til ordre efter det samlede antal, hvis det ønskes.
Den del producerede fejlen som $sort
er et nuværende felt og ikke en feltværdi med $
notation.
Men selvfølgelig skal du erstatte det faktiske _id
for at udgive som en klient tilgængelig samling med noget forventet. Så tilfældig id-generering fungerer her, ligesom inklusion af de andre felter.
For lidt flere detaljer, og også en alternativ til "hacks"-pakken, der bare fungerer med en vanille-installation, er der også dette svar af mig selv, der har en komplet liste som eksempel.