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

Mongoose如何对嵌套数组对象中的日期字段排序

如何对MongoDB嵌套数组提取后的订单按日期降序排序?

问题场景

现有MongoDB文档结构如下:

{
  "role": "User",
  "fullName": "Verna Pagac",
  "username": "dwightkoss95",
  "email": "shawn.ryan@yahoo.com",
  "orders": [
    {
      "buyerUsername": "admin",
      "boughtAt": "2022-09-20T20:14:59.304Z"
    },
    {
      "buyerUsername": "admin",
      "boughtAt": "2022-10-30T22:35:35.546Z"
    }
  ]
}

已通过以下代码提取所有订单:

const usersWithOrders = await users
  .find({
    orders: { $exists: true, $ne: [] }
  })

const orders = []
usersWithOrders.map((user) => {
  for (let i=0 ; i<user.orders.length ; i++) {
    orders.push(user.orders[i])
  }
})

需要将提取后的orders数组按boughtAt字段降序排序(最新订单在前)。

两种实现方式

方式一:提取后用JavaScript排序

直接对已提取的orders数组使用Array.sort()方法,通过时间戳比较排序:

// 降序排序,最新订单在前
orders.sort((a, b) => new Date(b.boughtAt) - new Date(a.boughtAt));

如果boughtAt在MongoDB中存储的是Date类型而非字符串,可直接比较无需转换:

orders.sort((a, b) => b.boughtAt - a.boughtAt);

方式二:MongoDB查询阶段直接处理(更高效)

若数据量较大,建议直接在数据库聚合管道中完成数组展开、排序,避免内存处理大量数据:

const sortedOrders = await users.aggregate([
  // 过滤存在非空orders的文档
  { $match: { orders: { $exists: true, $ne: [] } } },
  // 将orders数组拆分为单个文档
  { $unwind: "$orders" },
  // 按boughtAt降序排序
  { $sort: { "orders.boughtAt": -1 } },
  // 只保留订单字段(可选)
  { $replaceRoot: { newRoot: "$orders" } }
]).toArray();

这种方式直接从数据库返回已排序的订单列表,无需额外编写提取和排序逻辑,性能更优。

内容的提问来源于stack exchange,提问作者mahdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:33:49