Als u de meteor hacks-aggregaat
gebruikt pakket om een .aggregate()
. te implementeren commando op uw verzameling, dan zal het alleen als reactie een array retourneren. Dus je moet dat verwerken in een vorm van een gepubliceerde collectie:
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();
});
Of om de false
. op te nemen telt zoals uw voorgestelde uitvoer zichzelf voorstelt:
{ "$group": {
"_id": "$userId",
"progressState": { "$first": true },
"count": { "$sum": { "$cond": ["$progressState", 1,0] }
}},
{ "$sort": { "_id": 1 } }
Als de pijplijn met een $cond
evaluatie om te zetten in numeriek.
Waar je in de basisaggregatie gewoon de overeenkomende resultaten "optellen" en natuurlijk de $sort
verwijst naar een veld dat aanwezig is in de uitvoer, wat volgens uw voorbeeld de waarde "userId" zou zijn die nu in de _id
staat sleutel uit aggregatie, maar kan indien gewenst ook worden "geteld" op volgorde van het totale aantal.
Dat deel produceerde de fout, zoals $sort
is een huidig veld en geen veldwaarde met $
notatie.
Maar om als client toegankelijke collectie te publiceren, moet u natuurlijk de daadwerkelijke _id
. vervangen met iets verwacht. Dus het genereren van willekeurige ID's werkt hier, net als het opnemen van de andere velden.
Voor een beetje meer detail, en ook een alternatief voor het "hacks"-pakket dat gewoon werkt met een vanille-installatie, is er ook dit antwoord door mijzelf die een volledige lijst als voorbeeld heeft.