MongoDB聚合查询:从多文档中筛选指定对象
MongoDB聚合查询:匹配产品标签对应的维度对象
先明确集合示例结构,方便理解:
- Collection1(命名为
dimensionsCollection)文档结构:
{ "_id": "col1_doc1", "dimension": [ { "_id": "dim_1", "dimensionChild": "尺寸A" }, { "_id": "dim_2", "dimensionChild": "尺寸B" }, { "_id": "dim_3", "dimensionChild": "尺寸C" } ] }
- Collection2(命名为
productsCollection)文档结构:
{ "_id": "prod1", "productTags": ["dim_1", "dim_3", "other_tag_1"] }
方案一:从产品集合发起查询(获取指定产品的匹配维度)
如果要针对某款产品,提取其productTags对应的维度对象,用以下聚合管道:
db.productsCollection.aggregate([ // 可选:仅查询特定产品,移除则返回所有产品的匹配结果 { $match: { _id: "prod1" } }, { $lookup: { from: "dimensionsCollection", let: { tagIds: "$productTags" }, pipeline: [ // 将dimension数组拆分为独立文档 { $unwind: "$dimension" }, // 筛选出_id在productTags中的维度项 { $match: { $expr: { $in: ["$dimension._id", "$$tagIds"] } } }, // 将维度对象作为根文档返回 { $replaceRoot: { newRoot: "$dimension" } } ], as: "matchedDimensions" } }, // 可选:仅保留维度列表,移除产品其他字段 { $project: { matchedDimensions: 1, _id: 0 } } ])
方案二:从维度集合发起查询(获取所有被引用的维度)
如果要找出所有被产品标签引用过的维度对象,用以下聚合管道:
db.dimensionsCollection.aggregate([ // 将dimension数组拆分为独立文档 { $unwind: "$dimension" }, { $lookup: { from: "productsCollection", localField: "dimension._id", foreignField: "productTags", as: "matchedProducts" } }, // 仅保留存在匹配产品的维度项 { $match: { "matchedProducts.0": { $exists: true } } }, // 提取维度对象 { $replaceRoot: { newRoot: "$dimension" } }, // 可选:去重(同一维度被多产品引用时避免重复) { $group: { _id: "$_id", dimensionChild: { $first: "$dimensionChild" } } } ])
错误原因说明
之前的查询返回所有维度,是因为$lookup仅关联了Collection1,但未对dimension数组做筛选。核心要在$lookup的内部管道中先拆分数组,再通过$in匹配标签ID,或在关联后筛选出有匹配项的结果。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

