2014-11-08 73 views
0
其余

您好,我有以下代码现在的工作:猫鼬群聚集不回场

app.get('/api/checkAv/:checkIn/:checkOut', function(req, res) { 
    var checkIn = req.params.checkIn, 
     checkOut = req.params.checkOut, 
     roomType = req.params.roomType, 
     startDate = moment(checkIn), 
     endDate = moment(checkOut), 
     nights = endDate.diff(startDate, 'days'); 
      model.Av.aggregate([ 
       {$match: {dateOfDay: {$gte: new Date(checkIn), $lt:new Date(checkOut)} }}, 
       {$group: { 
        _id: '$roomId', 
        total: {$sum: '$price'}, 
        count: {$sum: 1}, 
        avg: {$avg: '$price'} 
       }}, 
       { $match: { count: { $gte: nights } } } 
       ], function (err, result) { 
      if (err) 
       res.send(err); 

      res.json(result); 

     }); 
}); 

还给我一样的东西:

[ 
{ 
"_id": "545b4848344044fa3ec9ac74", 
"total": 180, 
"count": 2, 
"avg": 90 
} 
] 

,但我想我回报也一些其他领域从集合,我不需要/有他们在小组条款例如:可用,价格...

阅读Mongoose文档我明白我需要使用$项目的这个问题,所以我添加了s omething像:

{$project: {price: "$price"}} 

,现在我得到的只是空的结果...我在$组原因类似尝试添加:

价格:“$价格”没有成功,我得到:“例外:组合字段“价格”必须定义为一个对象内的表达式“,我忽略了错误而没有成功,我应该如何实现这一目标?

回答

1

您将它们添加到$group,但你需要使用决定要如何多值每_idroomId)降低到一个值accumulator operators之一。

如果您考虑一下,只需添加price: "$price"就没有意义了,您希望它使用哪种价格值?

所以它需要是这样的:

price: {$first: '$price'} // To use the first price for this roomId (be sure to sort) 

price: {$push: '$price'} // To put all of the prices for this roomId into an array 

price: [$max: '$price'} // To use the maximum of all the prices for this roomId 

等等...希望你的想法。

+0

谢谢你的价格:{$ first:'$ price'}是我一直在寻找 – Teodor 2014-11-08 18:17:25