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


129

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

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

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

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

但是我什么也没回来,我想念什么吗,因为根据mongodb docs,这应该是可能的。如果我在mongo控制台中执行查询,则可以正常工作,这是否意味着api不支持它,或者我只是使用不正确?

Answers:


191

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

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

8
另请注意,以regex开头的锚定(即:从开头^)能够使用db中的索引,并且在这种情况下运行速度会更快。
drevicko

1
某些情况下,以^开头的正则表达式只能使用索引。使用re.IGNORECASE时,我相信mongo不能使用索引来执行查询。
nonagon

此用法记录在某处吗?我在官方的pymongo API文档中找不到此文件。
Hieu

153

事实证明,在pymongo中进行正则表达式搜索的方式略有不同,但同样简单。

正则表达式如下:

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

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


9
实际上,如果您使用,那么您在这里拥有的也是用javascript(可能还有其他语言)完成方式$regex。@Eric的答案是python方式有些不同。
drevicko

有什么不同?他们俩都使用python pymongo正确吗?它是mongodb查询的一部分,因此我看不到这个问题。
德克斯特(Dexter)2014年

10
也可以在mongodb JScript的正则表达式中忽略Ignorecase。db.collectionname.find({'files':{'$ regex':'^ File','$ options':'i'}})
Ajay Gupta 2015年

5
在我看来,这个答案看起来更好。如果您只是要对它进行字符串化处理,以便Mongo可以再次进行编译,为什么还要麻烦编译Python RE?Mongo的$regex运算符接受一个$options参数。
Mark E. Haase 2015年

3
请使用r'^File'而不是'^File'避免其他问题
Aminah Nuraini

9

为了避免双重编译,您可以使用PyMongo随附的bson regex包装器:

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

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

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

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

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


1
如果您需要使用$ in匹配数组,则$ regex对您不起作用。bson.regex.Regex 会成功的!
odedfos

4

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.