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
相关产品推荐
相关产品推荐

