2010-08-14 50 views
99

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

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

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

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

但我什么也没有回来,我失去了一些东西,因为根据MongoDB的文档,这应该是可能的。如果我在mongo控制台中执行查询,它工作正常,这是否意味着api不支持它,或者我只是不正确地使用它

回答

117

原来,pymongo中的正则表达式搜索有点不同,但同样简单。

正则表达式是为完成如下:

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

这将匹配有,有一个项目中,与文件

+8

实际上,你在这里也是[它在javascript中完成的方式](http://docs.mongodb.org/manual/reference/operator/regex/)(也可能是其他语言),如果你使用' $ regex'。 @埃里克的回答是python的方式有点不同。 – drevicko 2013-08-13 23:33:47

+0

有什么区别?他们都使用python pymongo正确吗?它是mongodb查询的一部分,所以我没有真正看到问题。 – Dexter 2014-12-22 18:40:26

+5

Ignorecase在mongodb JScript的正则表达式中也是可能的。 db.collectionname.find({'files':{'$ regex':'^ File','$ options':'i'}}) – 2015-04-25 10:37:20

143

如果你想包括正则表达式选项启动一个文件属性的所有文档(如如忽略大小写),试试这个:

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

还要注意,正则表达式的锚定在开始处(即:以'^'开头)能够使用在数据库中的索引,并在这种情况下运行得更快。 – drevicko 2013-08-13 23:31:48

+0

正则表达式以^开头,只能在[某些情况下]使用索引(http://docs.mongodb.org/manual/reference/operator/query/regex/)。在使用re.IGNORECASE时,我相信mongo不能使用索引来执行查询。 – nonagon 2015-04-08 18:08:38

+0

这种用法记录在某处吗?我在官方的pymongo API文档中找不到这个。 – Hieu 2017-10-16 22:38:00

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) 

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