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

如何按最新订单时间排序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();
代码说明
  1. $group阶段:通过$max: '$paidOn'提取每个店铺的最新订单时间,命名为latestPaidOn,这是后续排序的核心依据。
  2. $lookup阶段:用店铺ID直接关联Shop集合,比原管道写法更简洁高效。
  3. $sort阶段:基于计算出的latestPaidOn字段降序排序,确保结果按最新订单时间从晚到早排列。
  4. $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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:36:23