Pymongo $regexMatch 正则表达式选项中的无效标志:u

Posted

技术标签:

【中文标题】Pymongo $regexMatch 正则表达式选项中的无效标志:u【英文标题】:Pymongo $regexMatch invalid flag in regex options: u 【发布时间】:2020-11-14 10:31:31 【问题描述】:

使用 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 是从哪里来的呢?

【问题讨论】:

【参考方案1】:

我的猜测是您正在执行类似Working with UTF-8 encoding in Python source 的操作来将源编码设置为 utf-8,这会将 unicode 标志添加到您的正则表达式中。

https://docs.mongodb.com/manual/reference/operator/aggregation/regexMatch/ 支持将正则表达式和选项指定为字符串而不是正则表达式对象。

【讨论】:

是的,我刚刚发现使用正则表达式的其他定义格式,它可以工作。必须是 pymongo 中的问题或限制。 关于 utf-8 编码添加 unicode 标志。将re 对象用于$match 阶段,例如'$match': 'promo_code': re.compile('.*some.*'),它起作用了。所以它看起来像是与 $regexMatch 相关的东西。 Python版本也是3.7.2 如果你觉得这是一个pymongo问题,你可以通过jira.mongodb.org/browse/PYTHON报告。【参考方案2】:

通过使用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 $regexMatch 正则表达式选项中的无效标志:u的主要内容,如果未能解决你的问题,请参考以下文章

PyMongo $in + $正则表达式

pymongo处理正则表达式的情况

如何在 pymongo 中正确设计正则表达式?

如何使用正则表达式查询 pymongo 以获取仅包含数字的值

Sql Server 使用正则表达式

std::regexC++文件路径正则表达式