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

RC1*_*140 123 mongodb pymongo

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

{
  "files": [
    "File 1",
    "File 2",
    "File 3",
    "File 4"
  ],
  "rootFolder": "/Location/Of/Files"
}
Run Code Online (Sandbox Code Playgroud)

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

db.collectionName.find({'files':'/^File/'})
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ric 181

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

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

  • 另请注意,在开始时锚定的正则表达式(即:以`^`开头)能够使用db中的索引,并且在这种情况下运行速度会快得多. (8认同)

RC1*_*140 148

事实证明正则表达式搜索在pymongo中有所不同,但同样容易.

正则表达式完成如下:

db.collectionname.find({'files':{'$regex':'^File'}})
Run Code Online (Sandbox Code Playgroud)

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

  • 在mongodb JScript的正则表达式中也可以使用忽略.db.collectionname.find({ '文件':{ '$正则表达式': '^文件', '$选项': 'I'}}) (10认同)
  • 实际上,如果你使用`$ regex`,你在这里也有[在javascript中完成的方式](http://docs.mongodb.org/manual/reference/operator/regex/)(也可能是其他语言) .@ Eric的答案是蟒蛇的方式有点不同. (8认同)
  • 这个答案对我来说看起来更好.如果你打算对它进行字符串化以便Mongo可以再次编译它,为什么还要编译Python RE呢?Mongo的`$ regex`运算符采用`$ options`参数. (5认同)
  • 请使用`r'^ File'`而不是''^ File'来避免其他问题 (3认同)

Kee*_*ely 5

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

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

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

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

>>> db.collectionname.find({'files':{'$regex':'^File'}})
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您需要使用 $in 再次匹配数组,那么 $regex 对您不起作用。`bson.regex.Regex ` 可以解决问题! (2认同)

小智 5

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

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

(我不能在他们的回复下面发表评论,所以我在这里回复)