MongoDB聚合拼接字段加前缀后lookup关联查询另一集合方法
MongoDB 跨集合关联聚合查询实现方案
完整实现代码
db.sites.aggregate([ // 1. 过滤未访问的站点文档 { $match: { hasVisited: false } }, // 2. 关联webpages集合,自定义拼接匹配逻辑 { $lookup: { from: "webpages", // 声明要用到的sites集合字段,供关联管道内引用 let: { siteHost: "$host", sitePath: "$path" }, pipeline: [ { $match: { $expr: { $eq: [ "$url", // 拼接前缀+host+path构造完整匹配url { $concat: ["https://", "$$siteHost", "$$sitePath"] } ] } } } ], // 匹配结果存入的字段名 as: "matchedPages" } } ])
逻辑说明
$match阶段:过滤sites集合中hasVisited为false的文档,对应原逻辑中的findOne查询条件$lookup阶段:采用自定义管道的关联模式,规避默认关联不支持计算字段的限制:- 通过
let声明当前sites文档中需要用到的host、path字段,在关联管道内以$$前缀引用 - 用
$concat运算符拼接固定前缀https://、站点host、站点path,和webpages的url字段做等值匹配 - 所有匹配的网页文档会存入
matchedPages数组字段
- 通过
格式兼容处理
如果需要和原逻辑返回格式完全一致(直接得到网页文档数组),可以在聚合管道末尾追加两个阶段:
{ $unwind: "$matchedPages" }, { $replaceRoot: { newRoot: "$matchedPages" } }
内容的提问来源于stack exchange,提问作者Mix Master Mike
相关产品推荐
相关产品推荐

