MongoDB 对带括号的文本进行不区分大小写的查询
MongoDB case insensitive query on text with parenthesis
我在 mongodb.
上的不区分大小写的查询中遇到了一个非常烦人的问题
我在 Web 应用程序中使用 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"}}
当我有简单的文本时效果很好,例如:
caPITella CapitatA
but...but...当有parenthesis () 查询不工作。
它根本不起作用,即使查询文本是按照文档中的写法写的...示例:
查询 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 (....)
所以...我做错了什么?我忘了一些 Pattern.SOME 包含在 Pattern.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"}}
有效。
如果使用带有 "string" 的 $regex
运算符作为输入,那么您必须引用保留字符的文字,例如 ()
.
通常这是一个 \
,但由于它已经在一个字符串中,所以您需要执行两次 \
:
{ "myField" : {
"$regex" : "Ceratonereis \(Composetia\) costae" ,
"$options" : "iu"
}}
使用 $strcasecmp。
MongoDB 2.2 中引入了聚合框架。您可以使用字符串运算符“$strcasecmp”在字符串之间进行不区分大小写的比较。
比使用正则表达式更推荐也更容易。
这是一个老问题,但你可以使用 query.replace(/[-[\]{}()*+?.,\/^$|#\s]/g, "\$&");
这与 aggregate
和 matches
一起工作:
const order = user_input.replace(/[-[\]{}()*+?.,\/^$|#\s]/g, "\$&");
const regex = new RegExp(order, 'i');
const query = await this.databaseModel.aggregate([
{
$match: {
name : regex
}
// ....
我在 mongodb.
上的不区分大小写的查询中遇到了一个非常烦人的问题我在 Web 应用程序中使用 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"}}
当我有简单的文本时效果很好,例如:
caPITella CapitatA
but...but...当有parenthesis () 查询不工作。 它根本不起作用,即使查询文本是按照文档中的写法写的...示例:
查询 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 (....)
所以...我做错了什么?我忘了一些 Pattern.SOME 包含在 Pattern.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"}}
有效。
如果使用带有 "string" 的 $regex
运算符作为输入,那么您必须引用保留字符的文字,例如 ()
.
通常这是一个 \
,但由于它已经在一个字符串中,所以您需要执行两次 \
:
{ "myField" : {
"$regex" : "Ceratonereis \(Composetia\) costae" ,
"$options" : "iu"
}}
使用 $strcasecmp。 MongoDB 2.2 中引入了聚合框架。您可以使用字符串运算符“$strcasecmp”在字符串之间进行不区分大小写的比较。 比使用正则表达式更推荐也更容易。
这是一个老问题,但你可以使用 query.replace(/[-[\]{}()*+?.,\/^$|#\s]/g, "\$&");
这与 aggregate
和 matches
一起工作:
const order = user_input.replace(/[-[\]{}()*+?.,\/^$|#\s]/g, "\$&");
const regex = new RegExp(order, 'i');
const query = await this.databaseModel.aggregate([
{
$match: {
name : regex
}
// ....