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不区分大小写不检查精确匹配的主要内容,如果未能解决你的问题,请参考以下文章

AWK 忽略前后中间空格不区分大小写精确匹配

MongoDB:是不是可以进行不区分大小写的查询?

使用 MongoDB 在 Grails 中命名查询的列表方法中排序不区分大小写

mongoose 查询 $in 不区分大小写的正则表达式不起作用

MongoDB PyMongo - 创建索引并在两个字段中进行不区分大小写的搜索

location语法详解