求助:MongoDB聚合Lookup带条件查询仅匹配正则未匹配分类ID
解决MongoDB关联查询中分类匹配失效的问题
你的查询失效主要有两个核心问题,我来逐个拆解并给你修正后的方案:
问题分析
- 字段名错误:你的
article_category集合里存储分类ID的字段是all_category_id,但你在lookup的pipeline里写的是category_id,这会导致根本匹配不到任何分类数据。 - 未关联集合主键:你在lookup时没有建立
article和article_category之间的article_id关联,所以不管当前文章对应的分类是什么,都会把所有分类ID为8的article_category文档都关联过来,完全失去了关联查询的意义。
修正后的查询语句
db.article.aggregate([ // 第一步:先过滤标题符合正则的文章 { $match: { title: { $regex: /example/ } } }, // 第二步:关联article_category集合,只关联当前文章且分类包含8的记录 { $lookup: { from: "article_category", pipeline: [ { $match: { $expr: { // 关联两个集合的article_id $and: [ { $eq: ["$$ROOT.article_id", "$article_id"] }, // 检查all_category_id数组是否包含8 { $in: [8, "$all_category_id"] } ] } } } ], as: "article_category" } }, // 第三步:过滤掉没有匹配到对应分类的文章(即article_category为空数组的文档) { $match: { "article_category": { $ne: [] } } } ])
关键步骤解释
- 在
$lookup的pipeline中,使用$expr来引用外部集合(article)的字段$$ROOT.article_id,和当前article_category集合的article_id做匹配,确保只关联当前文章对应的分类数据。 - 用
$in操作符检查all_category_id数组中是否包含8,精准匹配分类条件。 - 最后一步的
$match会过滤掉那些没有匹配到分类8的文章,确保最终结果完全符合你的需求。
内容的提问来源于stack exchange,提问作者Viet Nguyen
相关产品推荐
相关产品推荐

