【问题标题】:Aggregation does not working in Mongoose with Match and Group聚合不适用于 Mongoose 与 Match 和 Group
【发布时间】:2015-07-02 22:05:10
【问题描述】:

我正在使用 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;       
      })



【问题讨论】:

    标签: angularjs node.js mongodb mongoose


    【解决方案1】:

    解决了!!!

    我的团队成员发现了错误! \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);
      }); 
    

    我希望这可以帮助某人。

    【讨论】:

      猜你喜欢
      • 2019-03-25
      • 2013-06-16
      • 2017-08-03
      • 1970-01-01
      • 2013-01-11
      • 2020-09-22
      • 1970-01-01
      • 2016-07-11
      相关资源
      最近更新 更多