[英]MongoDB aggregate and group nested field
我有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 ”對對象進行分組,並獲得每個groupx的速度平均值和總時間花費。
我像這樣使用聚合:
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
}
...
謝謝你,對不起我的英語。
我自己回答:)
這可能對某人有幫助。
...
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 );
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.