2015-06-06 76 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)); 
} 

现在它会正确进行不区分大小写的搜索。享受亲爱的:)