【发布时间】:2015-09-05 07:02:34
【问题描述】:
我在 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.compile() 中的 Pattern.SOME?有什么解决办法吗?
谢谢
----- 更新 ------
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"}}
有效。
【问题讨论】:
-
为什么在选项中使用
u("$options" : "iu")?
标签: regex mongodb mongodb-query