插件窝 干货文章 MongoDB子文档排序:如何使用聚合管道对嵌套数组进行倒序排序?

MongoDB子文档排序:如何使用聚合管道对嵌套数组进行倒序排序?

数组 倒序 字段 排序 524    来源:    2025-03-15

在MongoDB中,如果你想要对嵌套数组(子文档)进行倒序排序,可以使用聚合管道中的 $unwind$sort$group 等操作符来实现。以下是一个示例,展示如何对嵌套数组进行倒序排序。

假设你有一个集合 orders,其中每个文档包含一个 items 数组,数组中的每个元素是一个子文档,包含 nameprice 字段。你想要对每个订单中的 items 数组按照 price 字段进行倒序排序。

示例文档结构

{
  "_id": 1,
  "orderNumber": "ORD123",
  "items": [
    { "name": "Item A", "price": 100 },
    { "name": "Item B", "price": 200 },
    { "name": "Item C", "price": 50 }
  ]
}

聚合管道操作

db.orders.aggregate([
  // 展开 items 数组
  { $unwind: "$items" },

  // 按照 price 字段进行倒序排序
  { $sort: { "items.price": -1 } },

  // 重新分组,将排序后的 items 数组重新组合
  {
    $group: {
      _id: "$_id",
      orderNumber: { $first: "$orderNumber" },
      items: { $push: "$items" }
    }
  }
])

解释

  1. $unwind: 将 items 数组展开,使得每个子文档成为一个独立的文档。
  2. $sort: 对展开后的文档按照 items.price 字段进行倒序排序(-1 表示倒序)。
  3. $group: 将排序后的子文档重新组合成一个数组,并保留原始文档的其他字段(如 orderNumber)。

结果

执行上述聚合管道后,items 数组将按照 price 字段进行倒序排序。结果可能如下所示:

{
  "_id": 1,
  "orderNumber": "ORD123",
  "items": [
    { "name": "Item B", "price": 200 },
    { "name": "Item A", "price": 100 },
    { "name": "Item C", "price": 50 }
  ]
}

注意事项

  • 如果你只想对嵌套数组中的某些字段进行排序,可以在 $sort 阶段指定这些字段。
  • 如果嵌套数组中的子文档结构复杂,可能需要根据具体需求调整聚合管道的操作。

通过这种方式,你可以轻松地对MongoDB中的嵌套数组进行倒序排序。