使用pymongo执行正则表达式查询

时间:2010-08-14 12:42:24

标签: mongodb pymongo

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

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

我想获得与模式*文件匹配的所有文件。我试着这样做

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

然而我什么都没有回来,我错过了什么,因为根据mongodb文档,这应该是可能的。如果我在mongo控制台中执行查询它工作正常,这是否意味着api不支持它或我只是错误地使用它

5 个答案:

答案 0 :(得分:172)

如果要包含正则表达式选项(例如忽略大小写),请尝试以下操作:

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

答案 1 :(得分:138)

原来在pymongo中进行正则表达式搜索的方式略有不同,但同样容易。

正则表达式完成如下:

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

这将匹配具有文件属性的所有文档,该文件属性具有以文件

开头的项目

答案 2 :(得分:2)

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

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

正则表达式只是存储字符串而不尝试编译它,因此find_one可以将参数检测为“正则表达式”类型并形成相应的Mongo查询。

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

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

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

import re

def get_pattern_query(pattern,starting_with=False,ending_with=False,ignore_case=False):
    start = '^' if starting_with else '.*'
    end = '$' if ending_with else '.*'
    pattern = start + re.escape(pattern) + end
    return re.compile(pattern, re.IGNORECASE) if ignore_case else re.compile(pattern)

在编译之前转义模式处理所有字符。