在MongoDB的pymongo聚合中如何用$nin实现正则查询集过滤?
问题根因
你当前写法的核心错误是将正则表达式以普通字符串格式传入$nin:MongoDB对$nin数组内的字符串只会执行精确匹配,不会自动识别为正则规则做模糊匹配,因此筛选逻辑完全未生效。
修正后的聚合代码
直接将你需要的$not+$regex规则放入$match阶段即可,和你预期的find查询逻辑完全对齐:
.aggregate([ {"$match": {"free_id": { "$not": {"$regex": "XXX-XXX/YXYXYXYXY/.*"} }}}, { "$group": { "_id": "$free_id", "count": {"$sum": 1}, "ts": {"$last": "$payload.ts"} } }, { "$project": { "internal_id": {"$slice": [{"$split": ["$_id", "/"]}, 1, 1]}, "document_count": "$count", "last_ts": "$ts" } }, { "$group": { "_id": {"$first": "$internal_id"}, "docs": {"$sum": "$document_count"}, "last": {"$last": "$last_ts"} } }, ])
如果后续需要在$in/$nin中使用多正则匹配,不要传入字符串,要传入正则对象:pymongo场景下可以用re.compile(r"你的正则规则")生成正则对象后放入数组即可生效。
性能优化建议
你提到的运行耗时长问题,可以通过给free_id字段建立普通索引优化:当前你使用的正则规则是固定前缀开头,符合MongoDB索引前缀匹配的生效条件,加索引后查询速度会有大幅提升。
内容的提问来源于stack exchange,提问作者creyD
相关产品推荐
相关产品推荐

