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

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

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

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

但是我什么也没回来,我缺少一些东西,因为根据MongoDB文档,这应该是可能的。如果我在Mongo控制台中执行查询,则可以正常工作,这意味着API不支持它,或者我只是错误地使用它

有帮助吗?

解决方案 2

事实证明,在Pymongo上进行了REGEX搜索有所不同,但同样容易。

正则是如下:

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

这将匹配所有具有文件属性的文档,该文件属性从文件开始。

其他提示

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

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

为了避免双重编译,您可以使用Pymongo随附的BSON REGEX包装器:

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

Regex只是在不尝试编译的情况下存储字符串,因此Find_One可以将参数检测为“正则”类型并形成适当的Mongo查询。

我觉得这种方式比其他最高答案更具pythonic,例如:

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

如果您打算使用Regex查询,则值得阅读BSON REGEX文档,因为有一些警告。

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

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

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

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)

逃脱图案 在编译之前处理所有字符。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top