我对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
但是......但......当有括号()时,查询无法正常工作。 它根本不起作用,即使查询文本是按照文档中所写的那样写的......例如:
查询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"}}
作品。
答案 0 :(得分:2)
如果$regex
运算符使用"字符串"作为输入,您必须引用保留字符的文字,例如()
。
通常情况下,这只是一个\
,但由于它已经在字符串中,因此您需要执行两次\\
:
{ "myField" : {
"$regex" : "Ceratonereis \\(Composetia\\) costae" ,
"$options" : "iu"
}}
答案 1 :(得分:0)
使用$ strcasecmp。 聚合框架是在MongoDB 2.2中引入的。你可以使用字符串运算符" $ strcasecmp"在字符串之间进行不区分大小写的比较。 它比使用正则表达式更值得推荐和使用。
答案 2 :(得分:0)
这是一个古老的问题,但是您可以使用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
}
// ....