在MongoDB的$filter条件中使用Python re正则表达式无效问题排查
你的写法不对,问题出在这!
你把Python的re.compile()生成的正则对象直接丢给MongoDB聚合管道了——这可不行,MongoDB根本不认识Python的正则实例,得用它自己的正则处理方式才行。
怎么改?给你两种可行方案
方案1:用MongoDB 4.2+支持的$regexMatch(推荐)
这个操作符能灵活处理正则匹配,还能直接指定忽略大小写、多行模式这些选项,完全替代你原来的Python正则逻辑:
import json from pymongo import MongoClient client = MongoClient() db = client.your_db_name city = "abc" for doc in db.testusers.aggregate([ { "$project": { "data": { "$filter": { "input": "$data", "as": "item", "cond": { "$regexMatch": { "input": "$$item.city", "regex": f"^{city}$", # 精确匹配的正则规则 "options": "i" # i=忽略大小写,m=多行模式,按需添加 } } } } } } ]): print(json.dumps(doc))
如果你的city字符串里可能包含正则特殊字符(比如.、*),记得用re.escape(city)转义一下,避免正则语法出错。
方案2:兼容旧版MongoDB的$regex写法
如果你的MongoDB版本低于4.2,不支持$regexMatch,可以用传统的$regex语法:
import json import re from pymongo import MongoClient client = MongoClient() db = client.your_db_name city = "abc" escaped_city = re.escape(city) for doc in db.testusers.aggregate([ { "$project": { "data": { "$filter": { "input": "$data", "as": "item", "cond": { "$regex": ["$$item.city", f"^{escaped_city}$", "i"] } } } } } ]): print(json.dumps(doc))
额外提醒
如果你的需求只是精确匹配忽略大小写,其实不用正则也能实现,效率还更高:
cond: { "$eq": [ {"$toLower": "$$item.city"}, city.lower() ] }
把这段替换到$filter的cond里就行,简单直接。
内容的提问来源于stack exchange,提问作者Abhinandan Kothari
相关产品推荐
相关产品推荐

