mongo 正则表达式查询是不是有字符限制,如果正则表达式搜索字符串超过该限制,则会引发错误

Posted

技术标签:

【中文标题】mongo 正则表达式查询是不是有字符限制,如果正则表达式搜索字符串超过该限制,则会引发错误【英文标题】:Does mongo regex query have character limit, if the regex search string is more than that limit it throws errormongo 正则表达式查询是否有字符限制,如果正则表达式搜索字符串超过该限制,则会引发错误 【发布时间】:2017-03-01 20:02:18 【问题描述】:

当正则表达式搜索的字符串很大时,我看到 mongo 正则表达式查询不返回结果,而是抛出错误。我有一个场景,我附加了很多名字来做一个正则表达式,因此我的正则表达式搜索字符串超过了 40000 个字符。 例如:

db.getCollection('collection').find(
    "name":"$regex" :"name1 | name2 | name3", "$options":"-i"
)

【问题讨论】:

【参考方案1】:

你能解释一下你为什么这样做吗? 正则表达式的想法是创建一个匹配(多个)值的表达式。

示例表达式:

name\d+

将匹配所有 x 为小数的“namex”值。

我们的想法是创建一个表达式来满足您的查询要求。

当您想匹配多个字符串值时,您可以使用$and 运算符

【讨论】:

我正在做一个不区分大小写的搜索,查询如下所示 db.collection.find(name: "$regex":"red | white | blue|green" "$options": 'i')) 传递给正则表达式的值字符串真的可以变得非常大,当字符串的字符超过 37000 时,我看到 mongo 抛出异常 这不是正则表达式的用途...如果要查询,请使用 $and 运算符。 db.collection.find($and : [ name : "red", name : "blue" ]) 或 $in 运算符 : db.collection.find( name : $in : [ " red", "white", "blue", "green" ]) 你可以为它创建一个数组。要求您以小写形式存储该值,以便查询成功。从 MongoDB 3.4 开始,将有不区分大小写的索引:jira.mongodb.org/browse/SERVER-90 但我的问题是数据包含大写和小写(来自某些遗留系统的数据),我需要不区分大小写的搜索,所以我必须使用带有选项 i 的正则表达式【参考方案2】:

是的,mongoDB 正则表达式有字符限制,源自 perl 正则表达式限制。 因为“MongoDB 使用支持 UTF-8 的 Perl 兼容正则表达式(即“PCRE”)版本 8.41。”MongoDB v3.2

可以看到限制为 32764 个字符:MongoDB add assert of regular expression length

我最近遇到了这个问题,解决方法是改用 $in 查询运算符。 $in 没有字符限制。这适合我的问题,因为在如此长的输入情况下它是完全匹配而不是模式匹配。

【讨论】:

以上是关于mongo 正则表达式查询是不是有字符限制,如果正则表达式搜索字符串超过该限制,则会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

mysql中使用正则表达式

Mongo中不区分大小写的搜索

Mongo 正则表达式查询嵌入对象列表中的字段

正则表达式仅允许某些特殊字符并限制下划线

基于正则表达式排除 Mongo 字段

从查询字符串中删除一个参数的正则表达式