在node.js / express路由中的Mongoose组查询

时间:2014-11-07 11:56:08

标签: javascript node.js mongodb express mongoose

您好我在Robomongo中执行的以下查询按预期工作:

db.av.group(
{
 key: { roomId: 1},
 cond: { dateOfDay: { $gte: new Date('12/01/2014'), $lt: new Date('12/30/2014') } },
 reduce: function( curr, result ) {
            result.total += curr.price;
            result.count++;
         },
 initial: { total : 0,
     count : 0
     },
     finalize: function(result) {
              result.avg = Math.round(result.total / result.count);
          }

  }
)

在快递应用程序中实现后:

 app.get('/api/checkAv/:checkIn/:checkOut', function(req, res) {
        var checkIn = req.params.checkIn,
            checkOut = req.params.checkOut,
            roomType = req.params.roomType;

    model.Av.group(
    {
     key: { roomId: 1},
     cond: { dateOfDay: { $gte: new Date('12/01/2014'), $lt: new Date('12/30/2014') } },
     reduce: function( curr, result ) {
                result.total += curr.price;
                result.count++;
             },
     initial: { total : 0,
         count : 0
         },
         finalize: function(result) {
                  result.avg = Math.round(result.total / result.count);
              }

    }

    ).exec(function(err, av) {
        if (err)
            res.send(err);

        res.json(av);
    });
});

我上了控制台:

  

TypeError:对象函数模型(doc,fields,skipId){if(!(this   实例模型))        返回新模型(doc,fields,skipId); Model.call(this,doc,fields,skipId);没有方法'组'在   /home/www/domain.com/api/routes/routes.js:58:18在Layer.handle [as   handle_request]   (/home/www/domain.com/node_modules/express/lib/router/layer.js:82:5)
  在下一个   (/home/www/domain.com/node_modules/express/lib/router/route.js:100:13)   在Route.dispatch   (/home/www/domain.com/node_modules/express/lib/router/route.js:81:3)
  在Layer.handle [as handle_request]   (/home/www/domain.com/node_modules/express/lib/router/layer.js:82:5)
  在   /home/www/brasovapartments.com/node_modules/express/lib/router/index.js:234:24   在参议院   (/home/www/domain.com/node_modules/express/lib/router/index.js:331:14)   在参议院   (/home/www/domain.com/node_modules/express/lib/router/index.js:347:14)   在参议院   (/home/www/domain.com/node_modules/express/lib/router/index.js:347:14)   在Function.proto.process_params   (/home/www/domain.com/node_modules/express/lib/router/index.js:391:3)

现在阅读我看到一些人定义了一个组属性,但不确定Mongoose模式中的方式和位置? 你能不能给我一个暗示我的问题是什么?

1 个答案:

答案 0 :(得分:8)

Mongoose不支持group命令,MongoDB 3.4也弃用了该命令,因为使用aggregate可以更好地提供其功能。

您可以使用以下内容aggregate执行此操作:

model.Av.aggregate([
    {$match: {dateOfDay: {$gte: new Date('12/01/2014'), $lt:new Date('12/30/2014')}}},
    {$group: {
        _id: '$roomId',
        total: {$sum: '$price'},
        count: {$sum: 1},
        avg: {$avg: '$price'}
    }}
], function (err, result) {...});

如果您不需要,我们可以省略totalcount字段,因为$avg运算符可让您直接计算平均价格。