MongoDB聚合和组嵌套字段

时间:2017-02-15 02:13:14

标签: node.js mongodb mongodb-query aggregation-framework

我有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

}
...

谢谢你,对不起我的英语。

1 个答案:

答案 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 );

  });