在Node.js/Express路由中使用Mongoose进行分组查询

3

你好,我有一个在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);
          }

  }
)

在 express 应用程序中实现后:
 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: Object function model(doc, fields, skipId) { if (!(this instanceof model)) return new model(doc, fields, skipId); Model.call(this, doc, fields, skipId); } has no method 'group' at /home/www/domain.com/api/routes/routes.js:58:18 at Layer.handle [as handle_request] (/home/www/domain.com/node_modules/express/lib/router/layer.js:82:5)
at next (/home/www/domain.com/node_modules/express/lib/router/route.js:100:13) at Route.dispatch (/home/www/domain.com/node_modules/express/lib/router/route.js:81:3)
at Layer.handle [as handle_request] (/home/www/domain.com/node_modules/express/lib/router/layer.js:82:5)
at /home/www/brasovapartments.com/node_modules/express/lib/router/index.js:234:24 at param (/home/www/domain.com/node_modules/express/lib/router/index.js:331:14) at param (/home/www/domain.com/node_modules/express/lib/router/index.js:347:14) at param (/home/www/domain.com/node_modules/express/lib/router/index.js:347:14) at Function.proto.process_params (/home/www/domain.com/node_modules/express/lib/router/index.js:391:3)

经过阅读,我发现有些人定义了一个名为“group”的属性,但不确定是在哪里和如何定义。这个问题是否与Mongoose模式有关?请给我一些提示。

1个回答

11

group 命令在 Mongoose 中不被支持,并且在 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操作符可以直接计算平均价格。

实际上你是可以的。看这个链接:https://docs.mongodb.org/manual/reference/method/db.collection.group/ - Akarsh Satija
1
@AkarshSatija 当然,MongoDB支持它,但Mongoose库不支持它。这是我回答中的相同链接。 :-) - JohnnyHK
@godzsa 是的,尤其是自从3.4版本开始group命令被弃用后。 - JohnnyHK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接