142

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

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

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

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

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

4

4 回答 4

205

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

import re
regx = re.compile("^foo", re.IGNORECASE)
db.users.find_one({"files": regx})
于 2011-02-02T17:26:55.997 回答
163

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

正则表达式如下完成:

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

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

于 2010-08-14T13:02:17.117 回答
13

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

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

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

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

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

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

于 2018-05-23T10:21:37.080 回答
6

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

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

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

于 2018-08-16T07:44:41.190 回答