如何按最新订单时间排序Shop文档?Mongoose聚合问题
问题分析
你的聚合逻辑核心问题出在**$group阶段没有保留每个店铺的最新订单时间**,后续的$sort: { paidOn: -1 }找不到有效排序字段,导致MongoDB返回无固定顺序的结果,每次运行排序都可能变化。
正确聚合逻辑
要实现按店铺最新订单时间排序,需先在分组阶段计算出每个店铺的最晚订单时间,再基于该字段排序,最后关联店铺信息。以下是修正后的代码:
const aggregatedShops = await Order.aggregate([ // 1. 按店铺ID分组,计算每个店铺的最新订单时间 { $group: { _id: '$shop', latestPaidOn: { $max: '$paidOn' }, // 取该店铺所有订单中最晚的支付时间 orderCount: { $count: {} } // 可选:统计店铺订单数,不需要可删除 } }, // 2. 关联Shop集合获取店铺详情 { $lookup: { from: Shop.collection.collectionName, localField: '_id', foreignField: '_id', as: 'shop' } }, { $unwind: '$shop' }, // 展开店铺数组为单个文档 // 3. 按最新订单时间降序排序 { $sort: { latestPaidOn: -1 } }, // 4. 分页与元数据处理 { $facet: { metadata: [{ $count: 'total' }, { $addFields: { page: +page } }], data: [{ $skip: (+page - 1) * limit }, { $limit: +limit }] } } ]).exec();
代码说明
- $group阶段:通过
$max: '$paidOn'提取每个店铺的最新订单时间,命名为latestPaidOn,这是后续排序的核心依据。 - $lookup阶段:用店铺ID直接关联Shop集合,比原管道写法更简洁高效。
- $sort阶段:基于计算出的
latestPaidOn字段降序排序,确保结果按最新订单时间从晚到早排列。 - $facet阶段:保留你原有的分页逻辑,处理总数统计和分页数据。
验证结果
修正后运行,结果会与你的预期完全一致:
[ { 'Kitchen Store': '9/30/2022, 9/19/2022' }, { 'Pizza town': '9/29/2022, 9/20/2022' }, { 'Goddess Body Shop': '9/24/2022, 9/21/2022' }, { 'Book Store': '9/23/2022, 9/22/2022' } ]
内容的提问来源于stack exchange,提问作者Dashiell Rose Bark-Huss
相关产品推荐
相关产品推荐

