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 正则表达式查询是不是有字符限制,如果正则表达式搜索字符串超过该限制,则会引发错误的主要内容,如果未能解决你的问题,请参考以下文章