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

如何在Mongoose中对该Schema执行聚合操作?

Mongoose 聚合操作方案(针对你的嵌套数组Schema)

你的Schema核心是嵌套数组items,每个元素包含多集合关联ID及业务字段,下面针对常见聚合场景给出具体实现:

1. 关联填充所有嵌套引用文档

要把item、variation、addons、discount这些关联ID对应的文档数据填充出来,可通过$lookup结合$unwind、$group实现:

const result = await YourModel.aggregate([
  // 展开items数组,方便后续关联查询
  { $unwind: { path: "$items", preserveNullAndEmptyArrays: true } },
  // 关联Items集合,填充item字段
  {
    $lookup: {
      from: "items",
      localField: "items.item",
      foreignField: "_id",
      as: "items.item"
    }
  },
  // 将$lookup返回的数组转为单个对象
  { $unwind: { path: "$items.item", preserveNullAndEmptyArrays: true } },
  // 关联Variation集合,填充variation字段
  {
    $lookup: {
      from: "variations",
      localField: "items.variation",
      foreignField: "_id",
      as: "items.variation"
    }
  },
  { $unwind: { path: "$items.variation", preserveNullAndEmptyArrays: true } },
  // 关联Discount集合,填充discount字段
  {
    $lookup: {
      from: "discounts",
      localField: "items.discount",
      foreignField: "_id",
      as: "items.discount"
    }
  },
  { $unwind: { path: "$items.discount", preserveNullAndEmptyArrays: true } },
  // 处理嵌套的addons数组:先展开addons
  { $unwind: { path: "$items.addons", preserveNullAndEmptyArrays: true } },
  // 关联Addons集合,填充addons内的字段
  {
    $lookup: {
      from: "addons",
      localField: "items.addons.addons",
      foreignField: "_id",
      as: "items.addons.addons"
    }
  },
  { $unwind: { path: "$items.addons.addons", preserveNullAndEmptyArrays: true } },
  // 重新分组,还原items数组结构
  {
    $group: {
      _id: "$_id",
      baseFields: { $first: "$$ROOT" },
      items: { $push: "$items" }
    }
  },
  // 合并字段,还原原文档结构
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [ "$baseFields", { items: "$items" } ]
      }
    }
  },
  // 移除临时字段
  { $project: { baseFields: 0 } }
]);

2. 统计订单总金额、商品总数量

计算每个文档的items数组总金额、总数量:

const stats = await YourModel.aggregate([
  { $unwind: "$items" },
  {
    $group: {
      _id: "$_id",
      totalAmount: { $sum: "$items.amount" },
      totalQuantity: { $sum: "$items.quantity" },
      originalDoc: { $first: "$$ROOT" }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [ "$originalDoc", { totalAmount: "$totalAmount", totalQuantity: "$totalQuantity" } ]
      }
    }
  }
]);

3. 筛选包含特定商品/折扣的记录

比如筛选包含指定item ID的文档:

// 筛选包含指定item的记录
const filtered = await YourModel.aggregate([
  {
    $match: {
      "items.item": mongoose.Types.ObjectId("目标item ID")
    }
  },
  // 可选:仅保留匹配的items元素
  {
    $project: {
      items: {
        $filter: {
          input: "$items",
          cond: { $eq: [ "$$this.item", mongoose.Types.ObjectId("目标item ID") ] }
        }
      },
      // 保留其他需要的字段
      otherField1: 1,
      otherField2: 1
    }
  }
]);

如果你的需求是更复杂的场景(如嵌套统计、多条件组合筛选),可补充具体需求后再调整方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:52:50