2017-03-07 118 views
1

我临时工在这种格式的JSON一些飞行数据:蒙戈使用聚合

{"_id":{"$oid":"587d12881603f94800054dc5"},"flight_date":{"$date":"2015-08-23T00:00:00.000Z"},"flight_number":863,"destination_city":" Baltimore, MD","delay_in_minutes":0.0,"cancelled":0.0} 

我试图做的是找到的月份,取消的航班比例最高。我所编码的代码按月份将取消的航班分组,并将每个航班的年份除以总航班数。我想要做的是将每个月的取消航班除以该月的总航班(取消和未取消),所以我得到适当的比例。

var size = db.flights.count(); 
db.flights.aggregate(
[ 
    { 
    $project: { 
      cancelled_flights: { $eq: [ "$cancelled", 1 ] }, 
      month: { $substr: [ "$flight_date", 5, 2 ] }, 
     } 
    }, 
    { 
$match: {"cancelled_flights" : false} 
    }, 
    { 
$group: { 
     _id : "$month", 
     total : {$sum : 1 }, 
} 
    }, 
    { 
     $project: { 
       Total_Cancelled : "$total", 
       Ratio : { $divide: [ "$total", size] } 
} 
    }, 
     {$sort: {"Ratio":-1}}, 
     { $limit : 1 } 

]) 

我只是在学习mongo,所以请指出我的错误,我会解决它们。

回答

0

有几件事你可以做得到所需的输出。

建议:

您可以通过使用$condcancelled航班选择到$group阶段合并$match阶段。

您可以使用$month助手从日期中提取月份并将$project阶段合并到$group阶段。

答:

db.flights.aggregate([{ 
    $group: { 
     _id: { 
      $month: "$flight_date" 
     }, 
     total_flights: { 
      $sum: 1 
     }, 
     cancelled_flights: { 
      $sum: { 
       $cond: [{ 
        $eq: ["$cancelled", 1] 
       }, 1, 0] 
      } 
     } 
    } 
}, { 
    $project: { 
     ratio: { 
      $divide: ["$cancelled_flights", "$total_flights"] 
     } 
    } 
}, { 
    $sort: { 
     "ratio": -1 
    } 
}, { 
    $limit: 1 
}]) 
+0

请解释为什么它被downvoted。 – Veeram

+0

我不是downvoter,但你以前的版本有“在这里回答”。有一个链接不是堆栈溢出标准的好答案。我不确定你为什么选择这样做,但好的答案包含答案中的所有信息,并且没有链接。我特别困惑,为什么你选择链接到你的答案的早期版本... – Chris

+0

@克里斯感谢克里斯在这里伸出援手。我没有找到任何其他方式,因为欧普想要建议而不回答,所以这是我隐藏答案的方式。所以他可以在尝试了这些建议后点击它。 – Veeram

1

可以使用$ COND语句

{ 
    $group: { 
     _id: "$month", 
     total: { $sum: 1 }, 
     total_canceled: { $sum: { $cond: [{ $eq: ['cancelled_flights', true] }, 1, 0] } } 
     total_non_canceled: { $sum: { $cond: [{ $eq: ['cancelled_flights', false] }, 1, 0] } } 
    } 
}, 

$ COND语句的工作,比如$ COND得到相同的$组中的航班取消和非航班取消的总和:条件,如果为真,如果为假]

所以上面你会有总和'如果匹配cond',1,如果不是,0

然后,您可以使用这些结果来进一步处理信息如何选择

该团体abive会给你生命周期的航班数量,取消的航班总数以及所有1 $组中的未取消航班总数声明。