Node.js中用Mongoose纯查询实现同产品按计量单位排序补空的价格查询
纯Mongoose聚合查询方案
直接用MongoDB聚合框架实现,彻底避免循环查询的性能问题,核心通过左连接补全缺失的价格项,再按计量单位顺序排序:
const targetProductId = "你的目标产品ID"; // 替换为实际要查询的productId const result = await UnitMeasurement.aggregate([ // 1. 左连接指定产品的价格数据 { $lookup: { from: "prices", // 注意是MongoDB中Prices模型对应的实际集合名(默认是小写复数) let: { unitId: "$_id" }, pipeline: [ { $match: { $expr: { $and: [ { $eq: ["$productId", mongoose.Types.ObjectId(targetProductId)] }, { $eq: ["$unitMeasurementId", "$$unitId"] } ] } } } ], as: "priceData" } }, // 2. 处理空值:无对应价格则设为null { $addFields: { price: { $cond: { if: { $gt: [{ $size: "$priceData" }, 0] }, then: { $arrayElemAt: ["$priceData.price", 0] }, // 假设Prices模型有price字段 else: null } } } }, // 3. 按UnitMeasurement的指定字段排序(根据你的业务排序逻辑调整) { $sort: { order: 1 } }, // 若无需自定义排序,可改为 { _id: 1 } 按ID排序 // 4. 精简输出字段,保留需要的信息 { $project: { _id: 1, name: 1, // 保留计量单位的名称等业务字段 price: 1 } } ]);
关键逻辑说明
- $lookup左连接:以所有UnitMeasurement为基准,关联对应产品的价格数据,确保每个计量单位都被包含,缺失的价格会返回空数组
- $addFields补null:判断价格数据数组长度,为空则设price为null,否则提取匹配到的价格(适配一个计量单位对应一个价格的场景)
- $sort排序:严格按照计量单位的预设顺序输出,满足需求中的排序要求
- $project精简输出:只保留必要字段,减少数据传输开销
注意事项
- 确认
from字段的值是Prices模型在MongoDB中的实际集合名(Mongoose默认将模型名转为小写复数,比如Prices对应prices) - 若一个计量单位对应多个价格,可根据需求调整
$arrayElemAt为$first或其他聚合操作符 - 若UnitMeasurement没有专门的排序字段,可直接按
_id排序,或替换为业务对应的排序字段
内容的提问来源于stack exchange,提问作者Layynezz
相关产品推荐
相关产品推荐

