MongoDB使用$aggregate和$filter筛选data数组中国区任务结果不符合预期
MongoDB聚合查询问题排查及修复
问题根因
你写的聚合语句有两个核心错误导致过滤后data数组为空:
- 变量引用错误:$filter中通过
as: 'data'定义了遍历数组时的单元素变量名,引用该变量需要加双美元符$$,你写的$data.TASKLIST实际是引用根文档的整个data数组,不是当前遍历的单个元素属性。 - 匹配运算符错误:
$eq运算符不支持正则表达式匹配,用$eq直接对比字符串和正则永远返回false,正则匹配需要使用$regexMatch运算符。
修正后的聚合代码
db = db.getSiblingDB("quantum-ingress"); db.getCollection("ingressPayload").aggregate( [ { $match : { 'schemaVersion' : 'task', 'data.TASKLIST' : /.*China.*/i, 'timestamp' : { '$gt' : ISODate("2021-08-01T00:00:19.000+0000") } } }, { $project:{ data:{ $filter:{ input:'$data', as: 'data', cond: { $regexMatch: { input: '$$data.TASKLIST', regex: /.*China.*/i } } } } } }, // 可选:如果需要过滤掉过滤后data为空的文档,保留上面匹配阶段命中的、且过滤后仍有有效元素的文档,可加下面这一层 { $match: { data: { $ne: [] } } } ]);
内容的提问来源于stack exchange,提问作者user16918212
相关产品推荐
相关产品推荐

