Агрегация не работает в Mongoose с Match и Group

0

Я кодирую приложение, используя AngularJS, NodeJS и Mongoose. Теперь я делаю диаграмму, и мне нужно вернуть некоторые данные, передающие некоторые параметры. Но агрегация не работает. У меня этот запрос работает в MongoDB:



var user = db.getCollection('users').find(
{profile: "SUPERVISOR"},{_id: 1}).map(function(u){return u._id;}
)

db.getCollection("visitas").aggregate(
    { '$match':
     { createdAt:
       { '$gte': ISODate('2015-01-10T00:00:00.000Z'),
         '$lt': ISODate('2015-07-01T00:00:00.000Z') } } }, { '$group':
     { _id: { usuario: user, dia: [Object] },
      visitas: { '$sum': 1 } } }
)

Когда я пытаюсь запустить тот же запрос в своем приложении с помощью Mongoose, запрос не работает. Проблема, которую я видел, заключается в том, что запятая между MATCH и GROUP исчезает. Когда я пытаюсь выполнить поиск только с группой или совпадением, запрос работает. Кто-то может мне помочь? Это код приложения:





 .then(function (listaUsuarios){
           var argsVisit;
          console.log({ $match : { "createdAt" : { $gte: "2015-01-10T00:00:00.000Z", $lt: "2015-07-01T00:00:00.000Z"  }} },
                  { $group : { _id : { "usuario" : listaUsuarios , "dia" : { $dayOfMonth : "$createdAt" } }, "visitas" : { $sum : 1 } } });

          Visita.aggregate({ $match : { "createdAt" : { $gte: "2015-01-10T00:00:00.000Z", $lt: "2015-07-01T00:00:00.000Z"  }} },
                  { $group : { _id : { "usuario" : listaUsuarios , "dia" : { $dayOfMonth : "$createdAt" } }, "visitas" : { $sum : 1 } } })
            .exec(function (err, results) {
                    if (err) {
                        console.log("Erro!!!");
                        deferredDados.reject({
                            error: 500,
                            message: 'Erro buscando Visita, erro: '+err
                        });
                    } else {
                        if (!results || results.length == 0) {
                            console.log("Sem retorno!!!");
                            deferredDados.resolve( [0,0,0,0,0,0,0] ); //Tudo zerado poruqe não há retorno.
                            //deferredDados.resolve(0);

                            deferredDados.reject({
                                error: 500,
                                message: 'Erro buscando Visitas, não achou resultados'

                            });
                        } else {
                            console.log("Dados"+results);
                            deferredDados.resolve( results );
                            //deferredDados.resolve( results.data] );
                        }

                    }

                });
          return deferredDados.promise;       
      })



Теги:
mongoose

1 ответ

0

РЕШИТЬ !!!

Один из членов моей команды обнаружил ошибку! \o/Возможно, это поможет кому-то, у кого будет такая же проблема.

Чтобы решить, вам просто нужно преобразовать дату в строке в тип даты.

Решенный код приведен ниже:

.then(function (listaUsuarios){
       var argsVisit;


      if (tipoVisita == 'N'){
            argsVisit = {'user' : { "$in" :listaUsuarios }, 'tipo' : { "$in" : ["2001","2002"] }, "createdAt": {"$gte": dataInicial, "$lt": dataFinal }};
        } else if (tipoVisita == 'R'){
            argsVisit = {'user' : { "$in" :listaUsuarios }, 'tipo' : { "$in" : ["2005"] }, "createdAt": {"$gte": dataInicial, "$lt": dataFinal }};
        } else if (tipoVisita == 'I'){
            argsVisit = {'user' : { "$in" :listaUsuarios }, 'tipo' : { "$in" : ["2003"] }, "createdAt": {"$gte": dataInicial, "$lt": dataFinal }};
        }

        var initDate = new Date('2015-04-02T00:00:00.000Z');
        var endDate = new Date('2015-05-09T00:00:00.000Z');

       argsMatch = [{ $match : { "createdAt" : { $gte: initDate, $lt: endDate  }} },
                   { $group : { _id : { "usuario" : listaUsuarios , "dia" : { $dayOfMonth : "$createdAt" } },  "visitas" : {$sum : { $cond: [ {$or : [ { $eq: [ "$tipo", "2001"] },{ $eq: [ "$tipo","2002"] }] },1,0 ]}}}
                    }]

      Visita.aggregate(argsMatch)
        .exec(function (err, results) {
                if (err) {
                    console.log("Erro!!!");
                    deferredDados.reject({
                        error: 500,
                        message: 'Erro buscando Visita, erro: '+err
                    });
                } else {
                    if (!results || results.length == 0) {
                        console.log("Sem retorno!!!");
                        deferredDados.resolve( [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ); //Tudo zerado poruqe não há retorno.
                        //deferredDados.resolve(0);

                        deferredDados.reject({
                            error: 500,
                            message: 'Erro buscando Visitas, não achou resultados'

                        });
                    } else {
                        deferredDados.resolve( results );
                    }

                }

            });
      return deferredDados.promise;       
  })
  .then(function(dados) {
        res.json(dados);

    })
   .catch(function(fallback) {
    console.log('Erro no retorno dos usuarios!!!');
    console.log(fallback);
  }); 

Надеюсь, это поможет кому-то.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню