2012-07-31 45 views
3

我试图在Mongo中区分大小写的搜索。基本上我想不区分大小写的字符串匹配我正在使用正则表达式。这是我的代码SpringMongo不区分大小写的搜索正则表达式

Query query = new Query(Criteria.where(propName).regex(value.toString(), "i")); 

但上述剂量匹配我整个字符串(有时与空格字符串)。即使它是一个子字符串,它也会返回值。

例如:假设我的收藏有两个值“Bill”和“Bill status”,即使我的搜索是“bill status”,它也会返回我“bill”,即使有一个子字符串字符串我在寻找

我试图Query query = new Query(Criteria.where(propName).is(value.toString()));

但上面是区分大小写的。有人可以请这方面的帮助。

回答

2

正则表达式/ ^比尔$ /我将只匹配对“条例”不区分大小写。

在这里是表示本(在蒙戈壳)的示例:

> db.foo.insert({name: "Bill"}); 
> db.foo.insert({name: "Bill status"}); 
> db.foo.insert({name: "another Bill"}); 
> db.foo.find() 
{ "_id" : ObjectId("5018e182a499db774b92bf25"), "name" : "Bill" } 
{ "_id" : ObjectId("5018e191a499db774b92bf26"), "name" : "Bill status" } 
{ "_id" : ObjectId("5018e19ba499db774b92bf27"), "name" : "another Bill" } 
> db.foo.find({name: /bill/i}) 
{ "_id" : ObjectId("5018e182a499db774b92bf25"), "name" : "Bill" } 
{ "_id" : ObjectId("5018e191a499db774b92bf26"), "name" : "Bill status" } 
{ "_id" : ObjectId("5018e19ba499db774b92bf27"), "name" : "another Bill" } 
> db.foo.find({name: /^bill$/i}) 
{ "_id" : ObjectId("5018e182a499db774b92bf25"), "name" : "Bill" } 

但是,正则表达式查询将不会使用索引,除非它是左根(即。的形式/ ^前缀/),如果不区分大小写的标志不被使用。您可能会因使用使用索引的查询而付出巨大的性能损失。因此,这取决于你的使用情况,一个更好的选择可能是使用应用程序逻辑以某种方式,例如:当您将物品放入数据库

  1. 强制执行的情况下(如转换“法案”,旨在“法案”)。

  2. 对您的已知案例进行搜索(例如,仅针对“Bill”搜索)。

+0

感谢您抽出宝贵时间在这两个地方回复:)。我正在使用spring-mongo与mongo db进行交互。我可以在那里使用相同的吗?如果是这样,你能告诉我如何在我的代码中改变它吗?我从上面的命令中尝试了“i(/^value.tostring $)”。谢谢 – Droidme 2012-08-01 08:41:06

+0

@Droidme:作为spring-mongo的替代品,你可能想看看[Jongo](http://jongo.org/)。 Jongo目前的使命是“在Mongo shell中查询Java”。 – Stennie 2012-08-02 03:57:12

+7

我不是一个spring-mongo开发者,但是我建议你尝试: Query query = new Query(Criteria.where(propName).regex(“^”+ value.toString()+“$”,“i” )); – 2012-08-02 07:33:28

8

使用正则表达式搜索的不敏感搜索。 input_location可能是Delhi,delhi,DELHI,它适用于所有人。

Criteria.where("location").regex(Pattern.compile(input_location, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE))); 
+0

如果我只是想搜索不区分大小写的内容。例如,如果我找到“男性”,我应该得到“男性”和“男性”,但是我也因为它包含男性而得到“女性”。 – 2016-07-18 09:06:21