Como escrever grupo por consulta usando Mongoosejs?

Estou usando o nodejs, o mongoose odm e o mongo para um aplicativo da web e estou com problemas para tentar executar a consulta de estilo "group by" no mongoose:

var results = mymodel.collection.group (
{   
    keyf:
        function(doc)
        {
                var m = doc.date.getMonth();
                var d = doc.date.getDate();
                var y = doc.date.getFullYear();
                return { date: m + "/" + d + "/" + y };
        },
    cond: {},
    reduce: function(doc,prev) { prev.total += doc.value; },
    initial: { total: 0 }
}
);
if(results == null)
{
    console.log("results is null\n");
}

se eu executar o código "mymodel.collection.group" no shell mongo, ele funcionará perfeitamente. No entanto, em nodejs/mongoose parece retornar um resultado nulo mesmo que a documentação do mangusto afirme que o código mongo direto poderia ser executado contra o driver nativo do mongo.

Alguém tem alguma idéia de como resolver?

4

2 Respostas

Eu acabei de conseguir fazer isso no Mongoose. Para fazer isso, você precisa criar uma chamada encadeada e, no retorno de chamada, reduzir.

var foo = function(name, callback){
 Model.where('user', name).
        select('points').
        run(callback);
}

Então, o acima é o mapa e, em seguida, reduzir é

foo(name, function(errors, docs){ 
                var score = 0; 
                for (var i=0; i < docs.length; i++){ 
                  score += docs[i].points;
                });

Isso funciona para as minhas necessidades no momento

1
adicionado
Muito obrigado! Vou tentar isso.
adicionado o autor iancormac, fonte

Eu tive um problema semelhante, e eu poderia fazer isso com o framework de agregação.

mymodel.collection.aggregate (     {$ correspondência: CONDITION},     {$ group: _id: {                         year: {$ year: "$ date"},                         mês: {$ month: "$ date"},                         dia: {$ dayOfMonth: "$ date"}                 }                 count: {                         $ sum: 1                 }     }     {$ project: {                     encontro : {                         year: "$ _id.ano",                         mês: "$ _id.month",                         dia: "$ _id.day"                     }     }     {$ sort: {             "date.ano": 1,             "date.month": 1,             "date.day": 1             }     }     função (err, res) {.. função de retorno ..} );

1
adicionado
Por favor, forneça explicações para sua resposta.
adicionado o autor Spidy, fonte
JavaScript Brasil OFICIAL
JavaScript Brasil OFICIAL
4 138 dos participantes

Grupo sobre JavaScript do Brasil