如何在MongoDB聚合的$regex中传入动态字符串引用
问题原因
$regex查询操作符默认只能接收静态字符串作为正则规则,你直接写的'$keyword'会被识别为普通文本内容,而不会取当前campaign文档的keyword字段值,所以匹配失效。
解决方案
MongoDB 4.2及以上版本可以通过 $lookup + let + $expr + $regexMatch 的组合实现动态字段引用的正则匹配,修改后的聚合管道如下:
[ { $match: { type: 'FOLLOWUP' } }, { $lookup: { from: 'orders', // 声明要从父级campaign文档传入子管道的字段 let: { campaignKeyword: '$keyword' }, as: 'orders', pipeline: [ { $match: { $expr: { $regexMatch: { // 匹配orders集合的title字段 input: '$title', // 引用父级传入的keyword变量,需要加$$前缀 regex: '$$campaignKeyword', options: 'i' } } } } ] } } ]
注意事项
- 父文档的字段必须先在
$lookup的let参数中定义,才能在子管道中通过$$变量名的方式引用 - 只有在
$expr中使用聚合运算符$regexMatch,才支持动态传入正则内容,普通$regex查询不支持字段引用
内容的提问来源于stack exchange,提问作者Seerat Ahmed
相关产品推荐
相关产品推荐

