MongoDB如何按cityIsoCode分组,对嵌套flights排序并执行$slice:[1,1]?
可以实现!这里是具体的MongoDB聚合查询方案
当然可以完成你的需求,我们可以通过MongoDB的聚合管道组合多个操作符来实现,下面是详细的方案和代码:
具体聚合查询语句
db.yourCollectionName.aggregate([ // 第一步:展开flights数组,将每个航班条目拆分为独立文档 { $unwind: "$flights" }, // 第二步:按cityIsoCode分组,收集该城市下的所有航班数据 { $group: { _id: "$cityIsoCode", flights: { $push: "$flights" } } }, // 第三步:对航班数组按totalPrice升序排序,再截取指定位置的元素 { $project: { cityIsoCode: "$_id", flights: { $slice: [ { $sortArray: { input: "$flights", sortBy: { totalPrice: 1 } } }, 1, 1 ] }, _id: 0 } } ])
代码逻辑说明
$unwind:把每个文档中的flights数组拆分成独立文档,确保后续能收集到同一城市的所有航班(哪怕原始数据里一个城市对应多个文档也能处理)。$group:按cityIsoCode聚合,把该城市的所有航班重新组合成一个数组。$sortArray:对聚合后的航班数组按totalPrice升序排序(如果需要降序,把1改成-1即可)。$slice:从排序后的数组中,从索引1的位置开始取1个元素,完全匹配你要求的$slice:[1,1]规则。
测试结果验证
用你提供的测试数据运行这个查询,会得到你期望的输出:
{ "cityIsoCode" : "LED", "flights" : [ { "departureDate": "2019-01-03", "fromIsoCode": "MOW", "returnDate": "2019-01-09", "totalPrice": 829 } ] } { "cityIsoCode" : "KZN", "flights" : [ { "departureDate": "2019-01-03", "fromIsoCode": "MOW", "returnDate": "2019-01-03", "totalPrice": 551 } ] }
注意:记得把代码里的yourCollectionName替换成你实际使用的集合名称哦。
内容的提问来源于stack exchange,提问作者user1142464
相关产品推荐
相关产品推荐

