sql >> Base de Datos >  >> NoSQL >> MongoDB

Problema de agregación y agrupación de MongoDB en MeteorJS

Si está utilizando el agregado de hacks de meteoritos paquete para implementar un .aggregate() comando en su colección, entonces solo devolverá una matriz en respuesta. Así que necesitas convertir eso en una forma de colección publicada:

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();
});

O para incluir el false cuenta como su salida sugerida se sugiere a sí misma:

        { "$group": {
            "_id": "$userId",
             "progressState": { "$first": true },
             "count": { "$sum": { "$cond": ["$progressState", 1,0] }
        }},
        { "$sort": { "_id": 1 } }

Como canalización con un $cond evaluación para convertir a numérico.

Donde en la agregación básica simplemente está "totalizando" los resultados coincidentes y, por supuesto, el $sort se refiere a un campo presente en la salida, que según su ejemplo sería el valor "userId" ahora en el _id clave de agregación, pero también podría ser "contar" para ordenar por el conteo total si se desea.

Esa parte estaba produciendo el error, como $sort es un campo presente y no un valor de campo con $ notación.

Pero, por supuesto, para publicar como una colección accesible para el cliente, debe reemplazar el _id real. con algo esperado. Así que la generación de id aleatorios funciona aquí, al igual que la inclusión de los otros campos.

Para obtener un poco más de detalles, y también una alternativa al paquete "hacks" que solo funciona con una instalación estándar, también hay esta respuesta por mí mismo que tiene un listado completo como ejemplo.