2012-07-31 42 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