Java - MongoDB不区分大小写不检查精确匹配
Posted
技术标签:
【中文标题】Java - MongoDB不区分大小写不检查精确匹配【英文标题】:Java - MongoDB case insensitive not checking for exact match 【发布时间】:2015-06-06 11:19:31 【问题描述】:我正在尝试进行不区分大小写的查询,但通过这样做,可以通过输入用户名的一部分来找到用户。即用户名输入“f”,并且有一个用户名为“foo”的用户将返回 foo 的文档。
我正在使用它来检查不区分大小写的匹配项
private DBObject getQuery(String where, String whereValue)
return new BasicDBObject(where, Pattern.compile(whereValue, Pattern.CASE_INSENSITIVE));
如何检查完全匹配但忽略大小写?
【问题讨论】:
您要查找的“确切”字符串到底是什么?对我来说似乎更像是一个正则表达式问题。 当名称为“Foo”并且用户输入“foo”或“Foo”时,它将返回相同的文档。但不是当用户输入“f”或“fo”时。 【参考方案1】:这实际上与您正在使用的正则表达式模式有关。对于字符串中任何位置的“foo”和only“foo”,请使用:
/\bfoo\b/i
或者特别是在字符串的“开始”处:
/^foo\b/i
没有具体内容,您将无法获得“具体”匹配。
MongoDB 使用 pcre 库(或至少兼容),因此请使用匹配该约束的表达式。
当然,正如您所要求的,这确实包括 不区分大小写 的“i”选项。所以这将匹配 "foo" 和 "FOO" 的 "words" 以及其他可能的大小写变化。
还请注意,当使用基于 MongoDB 正则表达式的查询时,除非字符串以插入符号“^”“锚定”到字符串的开头,否则搜索将在集合中的所有文档上完成,而不仅仅是那些以某种形式包含“foo”的地方。
只有插入符号“^”可以使用索引,但“不区分大小写”选项也将其排除在外。
为了高效搜索,请在文档中包含一个“规范化”大小写的字符串,并希望只从字符串的开头查找。
【讨论】:
【参考方案2】:正则表达式以 ^ 字符开头并以 $ 字符结尾,它会正常工作。
private DBObject getQuery(String where, String whereValue)
return new BasicDBObject("^" + where + "$", Pattern.compile(whereValue, Pattern.CASE_INSENSITIVE));
【讨论】:
【参考方案3】:在上面给出的答案中,有一件事是错误的。 正则表达式应用于键而不是值。为了纠正它,我们应该在值上应用正则表达式,而不是像下面给出的代码这样的正则表达式。
private DBObject getQuery(String where, String whereValue)
return new BasicDBObject(where, Pattern.compile("^" + whereValue + "$", Pattern.CASE_INSENSITIVE));
现在它将正确地进行不区分大小写的搜索。享受亲爱的:)
【讨论】:
以上是关于Java - MongoDB不区分大小写不检查精确匹配的主要内容,如果未能解决你的问题,请参考以下文章
使用 MongoDB 在 Grails 中命名查询的列表方法中排序不区分大小写
mongoose 查询 $in 不区分大小写的正则表达式不起作用