如何在MongoDB中筛选关联单条data的Price的Option文档?
正确实现方法
先拆解你之前的问题:
- 第一种方法里,
find()返回的是游标对象,不是直接可用的_id数组,直接用它匹配options.prices肯定查不到结果,得先提取出符合条件的Price的_id列表。 - 第二种方法不仅集合名写错了(应该是
options而非option),还存在语法错误(pipeline括号没闭合),更关键的是逻辑没做全——你需要的是Option关联的所有Price都满足data长度为1,而不是只关联到部分符合条件的。
方案一:分步查询(简单直观)
第一步:先提取所有data长度为1的Price文档的_id数组
// 把符合条件的Price的_id提取成数组,只返回_id字段提升效率 const validPriceIds = db.prices.find( {"data": { $size: 1 }}, {_id: 1} ).map(doc => doc._id);
第二步:查询所有关联的Price都在这个有效列表里的Option
db.options.find({ // 确保prices数组里没有不在有效列表中的元素 "prices": { $not: { $elemMatch: { $nin: validPriceIds } } }, // 排除没有关联任何Price的Option(按需调整) "prices": { $ne: [] } });
方案二:用Aggregate一次性完成(更高效,适合大数据量)
通过$lookup关联Price集合,同时过滤符合条件的Price,再判断关联后有效Price的数量和原Option的prices数组长度是否一致(说明所有关联的Price都符合条件):
db.options.aggregate([ // 关联prices集合,只筛选当前Option关联的、且data长度为1的Price { $lookup: { from: "prices", let: { optionPriceIds: "$prices" }, pipeline: [ { $match: { $expr: { $and: [ { $in: ["$_id", "$$optionPriceIds"] }, { $eq: [{ $size: "$data" }, 1] } ] } } } ], as: "valid_related_prices" } }, // 过滤:有效Price数量和原关联Price数量相等,说明所有关联项都符合条件 { $match: { $expr: { $eq: [{ $size: "$prices" }, { $size: "$valid_related_prices" }] }, // 排除空数组的Option(按需调整) "prices": { $ne: [] } } }, // 可选:只保留需要的字段 { $project: { _id: 1, prices: 1 // 可添加其他需要返回的字段,比如name、description等 } } ]);
补充说明
如果你的实际需求是只要关联的Price中有一个符合条件(而非全部),可以简化为:
db.options.find({ "prices": { $in: validPriceIds } });
内容的提问来源于stack exchange,提问作者quentin desgardin
相关产品推荐
相关产品推荐

