MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Problema de agregação e agrupamento do MongoDB no MeteorJS


Se você estiver usando o agregado de hacks de meteoros pacote para implementar um .aggregate() command em sua coleção, ele retornará apenas uma matriz em resposta. Então você precisa trabalhar isso em uma forma de uma coleção 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();
});

Ou para incluir o false conta como sua saída sugerida sugere:
        { "$group": {
            "_id": "$userId",
             "progressState": { "$first": true },
             "count": { "$sum": { "$cond": ["$progressState", 1,0] }
        }},
        { "$sort": { "_id": 1 } }

Como o pipeline com um $cond avaliação para converter para numérico.

Onde na agregação básica você está apenas "totalizando" os resultados correspondentes e, claro, o $sort refere-se a um campo presente na saída, que pelo seu exemplo seria o valor "userId" agora no _id key da agregação, mas também pode ser "count" para ordenar pela contagem total, se desejado.

Essa parte estava produzindo o erro, como $sort é um campo presente e não um valor de campo com $ notação.

Mas é claro que para publicar como uma coleção acessível ao cliente, você precisa substituir o _id real com algo esperado. Portanto, a geração de ID aleatório funciona aqui, assim como a inclusão dos outros campos.

Para um pouco mais de detalhes, e também uma alternativa ao pacote "hacks" que funciona apenas com uma instalação vanilla, há também esta resposta por mim que tem uma listagem completa como exemplo.