You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:58:04