我有mongoDB使用像这样的mongoose的结果:
{
"_id" : { "$oid" : "589f926267d836193b0773fd"} ,
"id" : "3" ,
"update_date" : "2017-02-11" ,
"data":
[{
"groupx" : 3 ,
"speed" : 40 ,
"lon" : "-6.242747" ,
"lat" : "34.821839" ,
"update_timestamp" : "1486852706749" ,
"date" : { "$date" : 1486852706749}
} ,
{
"groupx" : 3 ,
"speed" : 120 ,
"lon" : "-6.7515" ,
"lat" : "33.96547" ,
"update_timestamp" : "1486852718771" ,
"date" : { "$date" : 1486852714771}
} ,
{
"groupx" : 4 ,
"speed" : 100 ,
"lon" : "-6.9515" ,
"lat" : "33.958047" ,
"update_timestamp" : "1486852714771" ,
"date" : { "$date" : 1486852714771}
} ,
{
"groupx" : 4 ,
"speed" : 80 ,
"lon" : "-6.92915" ,
"lat" : "33.928047" ,
"update_timestamp" : "1486852980615" ,
"date" : { "$date" : 1486852980615
}
}]
}
我希望按“ groupx ”对对象进行分组,并获得每个组x的速度平均值和总时间。
我使用了这样的聚合:
myModel.aggregate([
{ $match: {$and: rules } },
{
$project: {
_id: 0,
groupA: '$data.groupx',
speedA: '$data.speed',
dateA: '$data.date'
}},
{ $group: {
_id: '$groupA',
minDate: { $min: '$dateA'},
maxDate: { $max: '$dateA'},
avg_speed: { $avg: '$speedA'},
}}
]).exec(function ( e, d ) {
console.log( d )
});
请有人帮忙完成此查询。
//Desired result:
{
_id:
group:3
avg_speed:80
time_spent:19223556 //diff between min and max date in group 3
},
{
_id:
group:4
avg_speed:9
time_spent:19223556 //diff between min and max date in group 4
}
...
谢谢你,对不起我的英语。
答案 0 :(得分:0)
我自己回答:)
这可能对某人有帮助。
...
var id = req.params.id;
var rules = [{'_id' : id}];
{ $match: {$and: rules } },
{ $unwind : "$data" },
{ $project: {
_id: 0,
groupA: '$data.groupx',
speedA: '$data.speed',
dateA: '$data.date'
}},
{ $group: {
_id: '$groupA',
avgSpeedB: { $avg: '$speedA'},
minDate: { $min: '$dateA'},
maxDate: { $max: '$dateA'},
}},
{ $project: {
_id: 1,
debutB: '$minDate',
tempsSpentB: {$subtract: [ '$maxDate','$minDate']},
distanceB: { $multiply: [ '$avgSpeedB',{$subtract: [ '$maxDate','$minDate']}]},
avgSpeedB:1
}}.exec(function ( e, d) {
console.log( d );
});