[英]Mongoose group query in node.js / express route
您好,我在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);
});
});
我进入控制台:
类型错误:对象函数模型(文档,字段,skipId){如果(!(此模型实例))返回新模型(文档,字段,skipId); Model.call(this,doc,fields,skipId); }在Layer.handle的/home/www/domain.com/api/routes/routes.js:58:18处没有方法“组” [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 [作为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 at param(/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)
现在阅读周围,我看到有人定义了一个组属性,但是不确定猫鼬模式中的方式和位置。 您能给我一个提示吗,这里的问题是什么?
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) {...});
如果不需要它们,可以忽略total
和count
字段,因为$avg
运算符可让您直接计算平均价格。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.