Regex MongoDB对带括号文本的不区分大小写查询
我对mongodb上不区分大小写的查询有一个非常恼人的问题 我在web应用程序中使用MongoTemplate,需要对集合执行不区分大小写的查询 使用此代码Regex MongoDB对带括号文本的不区分大小写查询,regex,mongodb,mongodb-query,Regex,Mongodb,Mongodb Query,我对mongodb上不区分大小写的查询有一个非常恼人的问题 我在web应用程序中使用MongoTemplate,需要对集合执行不区分大小写的查询 使用此代码 Query q = new Query(); q.addCriteria(Criteria.where("myField") .regex(Pattern.compile(fieldValue, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE))); return mongoTemplate
Query q = new Query();
q.addCriteria(Criteria.where("myField")
.regex(Pattern.compile(fieldValue, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE)));
return mongoTemplate.findOne(q,MyClass.class);
我创建以下查询
{ "myField" : { "$regex" : "field value" , "$options" : "iu"}}
当我有简单的文本时,这非常有效,例如:
头状花序
但是…但是…当有括号()时,查询不起作用。
它根本不起作用,甚至查询文本也是按照文档中的方式编写的……示例:
问题1:
{"myField" : "Ceratonereis (Composetia) costae" } -> 1 result (ok)
问题2:
{ "myField" : {
"$regex" : "Ceratonereis (Composetia) costae" ,
"$options" : "iu"
}} -> no results (not ok)
问题3:
{ "scientificName" : {
"$regex" : "ceratonereis (composetia) costae" ,
"$options" : "iu"
}} -> no results (....)
那么…我做错什么了?我忘记了一些模式。一些要包含在模式中。compile()?有解决办法吗
谢谢
----更新---
user3561036的回答帮助我了解了必须如何构建查询
因此,我通过在中修改查询构建解决了这个问题
q.addCriteria(Criteria.where("myField")
.regex(Pattern.compile(Pattern.quote(myFieldValue), Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE)));
输出查询
{ "myField" : { "$regex" : "\\Qhaliclona (rhizoniera) sarai\\E" , "$options" : "iu"}}
有效。如果使用带有“字符串”的运算符作为输入,则必须为保留字符(如()
)引用文本
通常这是一个单独的\
,但由于它已经在一个字符串中,所以您需要执行两次\
:
{ "myField" : {
"$regex" : "Ceratonereis \\(Composetia\\) costae" ,
"$options" : "iu"
}}
使用$strcasecmp。
MongoDB 2.2中引入了聚合框架。您可以使用字符串运算符“$strcasecmp”在字符串之间进行不区分大小写的比较。
这是一个老问题,但你可以使用
query.replace(/[-[\]{}()*+?,\\/^$\s]/g,\\$&)代码>
这是使用聚合
和匹配项
:
const order = user_input.replace(/[-[\]{}()*+?.,\\/^$|#\s]/g, "\\$&");
const regex = new RegExp(order, 'i');
const query = await this.databaseModel.aggregate([
{
$match: {
name : regex
}
// ....
为什么在选项中使用u
(“$options”:“iu”)?很好,回答……它给了我解决问题的输入:“Query q=new Query();q、 addCriteria(Criteria.where(“myField”).regex(Pattern.compile(Pattern.quote(myFieldValue),Pattern.CASE不区分大小写| Pattern.UNICODE_CASE));'这给了我输出查询:“{”scientificName:“{”$regex:“\\Qhaliclona(rhizoniera)sarai\\E”,“$options:“iu”}}”,这是有效的。@dgiaig它应该指出的,因为使用字符串编译就是这样工作的。这里的方法是多余的,因为正如我所说,只保留像()
这样的字符。这是一个regex的核心问题。别忘了回答。@dgiag没关系,欢迎你。欢迎来到堆栈溢出。这主要是吃力不讨好的表现,目前你的问题有四票赞成和两票观察者,但这里只有一票赞成和你自己的接受(谢谢)。所以,只是预览一下要习惯什么。当我的字符串动态出现时,我该怎么做