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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:55:30