2015-06-06 74 views
1

我試圖有不區分大小寫的查詢,但通過這樣做,可以通過輸入部分用戶名來查找用戶。即用戶名在「f」中鍵入,並且有一個用戶名爲「foo」的用戶將返回foo的文檔。Java - MongoDB不區分大小寫不檢查完全匹配

我使用這個檢查不區分大小寫的匹配

private DBObject getQuery(String where, String whereValue) 
{ 
    return new BasicDBObject(where, Pattern.compile(whereValue, Pattern.CASE_INSENSITIVE)); 
} 

我如何檢查精確匹配,但忽略大小寫?

+0

什麼是你正在尋找的「確切」字符串?似乎更像是一個正則表達式問題給我。 –

+0

當名稱是「Foo」並且用戶輸入「foo」或「Foo」時,它們都將返回相同的文檔。但是當用戶輸入「f」或「fo」時不行。 – XLordalX

回答

1

這實際上都是關於你正在使用的正則表達式模式。對於在字符串的任何地方「foo」和只有「富」,使用此:

/\bfoo\b/i 

或者確切地說,在字符串的「開始」:

/^foo\b/i 

沒有細節你會不會獲得「特定」比賽。

MongoDB使用pcre庫(或至少兼容),以便使用匹配該約束的表達式。

當然,這包括「i」選項,不區分大小寫正如您所問。所以這將匹配「foo」和「FOO」的「單詞」以及其他可能的案例變體。

另請注意,當使用基於MongoDB正則表達式的查詢時,除非字符串與插入符號「^」錨定在字符串的開頭,否則搜索將通過集合中的所有文檔完成,而不僅僅是隻有那些以某種形式包含「foo」的地方。

只有插入符號「^」可以使用索引,但再次「不區分大小寫」選項也會將其吹走。

對於高效搜索,請在文檔中使用「標準化」大小寫包含一個字符串,並且希望僅從字符串的開頭查找。

0

用^字符開始你的正則表達式,並以$字符結束,它會正常工作。

private DBObject getQuery(String where, String whereValue) 
{ 
    return new BasicDBObject("^" + where + "$", Pattern.compile(whereValue, Pattern.CASE_INSENSITIVE)); 
} 
0

在上面給出的答案中有一點是錯誤的。 正則表達式應用於鍵而不是值。爲了糾正它,我們應該應用正則表達式而不是像下面給出的代碼那樣使用正則表達式。

private DBObject getQuery(String where, String whereValue) 
{ 
return new BasicDBObject(where, Pattern.compile("^" + whereValue + "$", Pattern.CASE_INSENSITIVE)); 
} 

現在它會正確進行不區分大小寫的搜索。享受親愛的:)