Si vous utilisez le meteor hacks cluster
package pour implémenter un .aggregate()
commande sur votre collection, elle ne renverra qu'un tableau en réponse. Vous devez donc intégrer cela dans une forme de collection publiée :
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();
});
Ou pour inclure le false
compte comme le suggère la sortie suggérée :
{ "$group": {
"_id": "$userId",
"progressState": { "$first": true },
"count": { "$sum": { "$cond": ["$progressState", 1,0] }
}},
{ "$sort": { "_id": 1 } }
En tant que pipeline avec un $cond
évaluation à convertir en numérique.
Où, dans l'agrégation de base, vous "totalisez" simplement les résultats correspondants et bien sûr le $sort
fait référence à un champ présent dans la sortie, qui par votre exemple serait la valeur "userId" maintenant dans le _id
clé de l'agrégation, mais peut également être "count" pour trier par le nombre total si vous le souhaitez.
Cette partie produisait l'erreur, comme $sort
est un champ présent et non une valeur de champ avec $
notation.
Mais bien sûr, pour publier en tant que collection accessible au client, vous devez remplacer le _id
réel avec quelque chose d'attendu. Ainsi, la génération d'identifiants aléatoires fonctionne ici, tout comme l'inclusion des autres champs.
Pour un peu plus de détails, et aussi une alternative au package "hacks" qui fonctionne uniquement avec une installation vanille, il y a aussi cette réponse par moi-même qui a une liste complète comme exemple.