我在数据库中有这个集合
[{name:1,startDate:1/1/13,endDate:2/2/13,number:10},
{name:1,startDate:2/2/13,endDate:5/2/13,number:15},
{name:2,startDate:2/1/13,endDate:5/2/13,number:25},
{name:1,startDate:5/2/13,number:17},
{name:2,startDate:5/2/13,number:30}]
我想得到一个开始日期的列表,其中包含这个开始日期范围内的数字的平均值,例如,这个集合的结果将是:
{date:1/1/13,avg:10},
{date:2/1/13,avg:17.5},
{date:2/2/13,avg:20},
{date:5/2/13,avg:23.5}
我试过一些地图缩减和分组,但没有人能正确地按开始日期分组,请帮忙。
您可以使用聚合pipleline:
db.collectionName.agregate([{$group:{_id:"$startDate",平均值:{$avg:"$number"}}])
这将按startDate对集合进行分组,聚合为数字的平均值。
如果您严格希望_id字段标记为startDate,那么可以在管道中使用$project操作:
db.collectionName.agregate([{$group:{_id:'$startDate',平均值:{$avg:'$number'}}}},{$project:{'startDate':'$_id','avg':'$savg',_id:0}])
这将产生所需的结果。
由于没有更好的方法,我只是从服务器端完成,
首先获取所有的startDate,然后预先形成一个迭代,找到日期范围内的每个文档,并对其数字求平均值。。。
没有放弃我所期望的解决方法,但它工作正常。