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

