Pymongo $regexMatch 正则表达式选项中的无效标志:u
Pymongo $regexMatch invalid flag in regex options: u
使用 PyMongo 3.10.1,MongoDB 4.2 下面的聚合,使用 $group
和 $regexMatch
在命令行上工作正常:
db.accounts.aggregate([
{'$lookup': {'from': 'users', 'localField': '_id', 'foreignField': 'user_id', 'as': 'users'}},
{'$unwind': "$users"},
{ "$group": {
"_id": {"_id": "$users.user_id"},
"users": {"$push": "$users"},
"total": {"$sum": {"$cond": [{"$regexMatch": {"input": "$users.email", "regex": /filtered/}},1,0]}}
}
},
])
但是 运行 使用 PyMongo 的等效聚合,在 $regexMatch
中给出 OperationFailure
:
pipeline = [
{'$lookup': {'from': 'users', 'localField': '_id', 'foreignField': 'user_id', 'as': 'users'}},
{'$unwind': '$users'},
{'$group': {
'_id': {'_id': '$users.user_id'},
'users': {'$push': '$users'},
'total': {'$sum': {'$cond': [{'$regexMatch': {'input': '$users.email', 'regex': re.compile('.*filtered.*', re.IGNORECASE)}}, 1, 0]}}}},
]
错误是:
File "/Users/gcw/.pyenv/versions/3.7.6/envs/tt-api-env/lib/python3.7/site-packages/pymongo/collection.py", line 2380, in aggregate
**kwargs)
File "/Users/gcw/.pyenv/versions/3.7.6/envs/tt-api-env/lib/python3.7/site-packages/pymongo/collection.py", line 2299, in _aggregate
retryable=not cmd._performs_write)
File "/Users/gcw/.pyenv/versions/3.7.6/envs/tt-api-env/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1464, in _retryable_read
return func(session, server, sock_info, slave_ok)
File "/Users/gcw/.pyenv/versions/3.7.6/envs/tt-api-env/lib/python3.7/site-packages/pymongo/aggregation.py", line 148, in get_cursor
user_fields=self._user_fields)
File "/Users/gcw/.pyenv/versions/3.7.6/envs/tt-api-env/lib/python3.7/site-packages/pymongo/pool.py", line 613, in command
user_fields=user_fields)
File "/Users/gcw/.pyenv/versions/3.7.6/envs/tt-api-env/lib/python3.7/site-packages/pymongo/network.py", line 167, in command
parse_write_concern_error=parse_write_concern_error)
File "/Users/gcw/.pyenv/versions/3.7.6/envs/tt-api-env/lib/python3.7/site-packages/pymongo/helpers.py", line 159, in _check_command_response
raise OperationFailure(msg % errmsg, code, response)
pymongo.errors.OperationFailure: Failed to optimize pipeline :: caused by :: $regexMatch invalid flag in regex options: u
但是这个正则表达式选项 u
来自哪里?
我猜你正在做类似 Working with UTF-8 encoding in Python source 的事情来将源编码设置为 utf-8,这会将 unicode 标志添加到你的正则表达式中。
https://docs.mongodb.com/manual/reference/operator/aggregation/regexMatch/ 支持将正则表达式和选项指定为字符串而不是正则表达式对象。
通过使用 options
语法更改正则表达式定义,它起作用了。在 PyMongo 中的工作管道下方。
pipeline = [
{'$lookup': {'from': 'users', 'localField': '_id', 'foreignField': 'user_id', 'as': 'users'}},
{'$unwind': '$users'},
{'$group': {
'_id': {'_id': '$users.user_id'},
'users': {'$push': '$users'},
'total': {'$sum': {'$cond': [{"$regexMatch": {"input": "$users.email", "regex": ".*tiquetaque.*", "options": "i"}}, 1, 0]}}}},
]
使用 PyMongo 3.10.1,MongoDB 4.2 下面的聚合,使用 $group
和 $regexMatch
在命令行上工作正常:
db.accounts.aggregate([
{'$lookup': {'from': 'users', 'localField': '_id', 'foreignField': 'user_id', 'as': 'users'}},
{'$unwind': "$users"},
{ "$group": {
"_id": {"_id": "$users.user_id"},
"users": {"$push": "$users"},
"total": {"$sum": {"$cond": [{"$regexMatch": {"input": "$users.email", "regex": /filtered/}},1,0]}}
}
},
])
但是 运行 使用 PyMongo 的等效聚合,在 $regexMatch
中给出 OperationFailure
:
pipeline = [
{'$lookup': {'from': 'users', 'localField': '_id', 'foreignField': 'user_id', 'as': 'users'}},
{'$unwind': '$users'},
{'$group': {
'_id': {'_id': '$users.user_id'},
'users': {'$push': '$users'},
'total': {'$sum': {'$cond': [{'$regexMatch': {'input': '$users.email', 'regex': re.compile('.*filtered.*', re.IGNORECASE)}}, 1, 0]}}}},
]
错误是:
File "/Users/gcw/.pyenv/versions/3.7.6/envs/tt-api-env/lib/python3.7/site-packages/pymongo/collection.py", line 2380, in aggregate
**kwargs)
File "/Users/gcw/.pyenv/versions/3.7.6/envs/tt-api-env/lib/python3.7/site-packages/pymongo/collection.py", line 2299, in _aggregate
retryable=not cmd._performs_write)
File "/Users/gcw/.pyenv/versions/3.7.6/envs/tt-api-env/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1464, in _retryable_read
return func(session, server, sock_info, slave_ok)
File "/Users/gcw/.pyenv/versions/3.7.6/envs/tt-api-env/lib/python3.7/site-packages/pymongo/aggregation.py", line 148, in get_cursor
user_fields=self._user_fields)
File "/Users/gcw/.pyenv/versions/3.7.6/envs/tt-api-env/lib/python3.7/site-packages/pymongo/pool.py", line 613, in command
user_fields=user_fields)
File "/Users/gcw/.pyenv/versions/3.7.6/envs/tt-api-env/lib/python3.7/site-packages/pymongo/network.py", line 167, in command
parse_write_concern_error=parse_write_concern_error)
File "/Users/gcw/.pyenv/versions/3.7.6/envs/tt-api-env/lib/python3.7/site-packages/pymongo/helpers.py", line 159, in _check_command_response
raise OperationFailure(msg % errmsg, code, response)
pymongo.errors.OperationFailure: Failed to optimize pipeline :: caused by :: $regexMatch invalid flag in regex options: u
但是这个正则表达式选项 u
来自哪里?
我猜你正在做类似 Working with UTF-8 encoding in Python source 的事情来将源编码设置为 utf-8,这会将 unicode 标志添加到你的正则表达式中。
https://docs.mongodb.com/manual/reference/operator/aggregation/regexMatch/ 支持将正则表达式和选项指定为字符串而不是正则表达式对象。
通过使用 options
语法更改正则表达式定义,它起作用了。在 PyMongo 中的工作管道下方。
pipeline = [
{'$lookup': {'from': 'users', 'localField': '_id', 'foreignField': 'user_id', 'as': 'users'}},
{'$unwind': '$users'},
{'$group': {
'_id': {'_id': '$users.user_id'},
'users': {'$push': '$users'},
'total': {'$sum': {'$cond': [{"$regexMatch": {"input": "$users.email", "regex": ".*tiquetaque.*", "options": "i"}}, 1, 0]}}}},
]