MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Problème d'agrégation et de regroupement de MongoDB dans MeteorJS

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.