【问题标题】:Performing regex queries with PyMongo使用 PyMongo 执行正则表达式查询
【发布时间】:2011-03-29 20:08:50
【问题描述】:

我正在尝试使用 PyMongo 对 MongoDB 服务器执行正则表达式查询。文档结构如下

{
  "files": [
    "File 1",
    "File 2",
    "File 3",
    "File 4"
  ],
  "rootFolder": "/Location/Of/Files"
}

我想获取所有与 *File 模式匹配的文件。我尝试这样做

db.collectionName.find({'files':'/^File/'})

但我什么也没得到。我是否遗漏了什么,因为根据 MongoDB 文档,这应该是可能的?如果我在 Mongo 控制台中执行查询,它工作正常,这是否意味着 API 不支持它或者我只是使用不正确?

【问题讨论】:

    标签: mongodb pymongo


    【解决方案1】:

    如果你想包含正则表达式选项(例如忽略大小写),试试这个:

    import re
    regx = re.compile("^foo", re.IGNORECASE)
    db.users.find_one({"files": regx})
    

    【讨论】:

    • 还要注意,正则表达式的锚定在开头(即:以^ 开头)能够使用数据库中的索引,并且在这种情况下运行速度会更快。
    • 以^开头的正则表达式只能使用certain cases中的索引。使用 re.IGNORECASE 时,我相信 mongo 不能使用索引来执行查询。
    • 这种用法是否记录在某处?我在官方 pymongo API 文档中找不到这个。
    【解决方案2】:

    结果表明,正则表达式搜索在 pymongo 中的执行方式略有不同,但同样简单。

    正则表达式如下:

    db.collectionname.find({'files':{'$regex':'^File'}})
    

    这将匹配所有具有 files 属性的文档,其中包含以 File 开头的项目

    【讨论】:

    • 实际上,如果您使用$regex,您在这里拥有的也是way it's done in javascript(可能还有其他语言)。 @Eric 的回答是 python 方式有点不同。
    • 有什么区别?他们都在使用 python pymongo 对吗?它是 mongodb 查询的一部分,所以我真的没有看到这个问题。
    • 在 mongodb JScript 的正则表达式中也可以忽略大小写。 db.collectionname.find({'files':{'$regex':'^File','$options':'i'}})
    • 这个答案在我看来更好看。如果您只是要将它字符串化以便 Mongo 可以再次编译它,为什么还要编译 Python RE? Mongo 的 $regex 运算符采用 $options 参数。
    • 请使用r'^File'而不是'^File'以避免其他问题
    【解决方案3】:

    为避免双重编译,您可以使用 PyMongo 附带的 bson 正则表达式包装器:

    >>> regx = bson.regex.Regex('^foo')
    >>> db.users.find_one({"files": regx})
    

    Regex 只是存储字符串而不尝试编译它,因此 find_one 可以将参数检测为“Regex”类型并形成适当的 Mongo 查询。

    我觉得这种方式比其他最佳答案稍微更 Pythonic,例如:

    >>> db.collectionname.find({'files':{'$regex':'^File'}})
    

    如果您打算使用正则表达式查询,则值得阅读 bson 正则表达式文档,因为有一些警告。

    【讨论】:

    • 如果您需要使用 $in 再次匹配一个数组,那么 $regex 将不适合您。 bson.regex.Regex 会成功的!
    【解决方案4】:

    re 的解决方案根本不使用索引。 您应该使用如下命令:

    db.collectionname.find({'files':{'$regex':'^File'}})

    (我无法在他们的回复下方发表评论,所以我在这里回复)

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2020-10-26
      • 1970-01-01
      • 2016-05-17
      • 2013-11-20
      • 2021-01-09
      • 1970-01-01
      相关资源
      最近更新 更多