【问题标题】:Exact case insensitive match in spring-data mongospring-data mongo中不区分大小写的精确匹配
【发布时间】:2014-06-18 20:41:14
【问题描述】:

我正在使用带有 mongo 的 spring 数据和一个存储库。例如:

@Query("{ 'userName' : ?0 }")
public User findByUsername(String username);

我想让这个大小写不敏感。我使用了以下查询:

"{'userName' : { $regex : ?0, $options: 'i' } }"

这可行,但它不仅匹配 testUser,还匹配 estUser。

我也试过

"{'userName' : { $regex : ^?0$, $options: 'i' } }"

但这无法解析查询,因为它试图在正则表达式中插入引号。

com.mongodb.util.JSONParseException: 
({ $regex : ^"testUser"$, $options: 'i' }
            ^

如果我尝试使用 /.../i 正则表达式,我会遇到同样的问题。

是否有任何解决方案,无需使用 mongoTemplate,或自己构建正则表达式?

【问题讨论】:

  • 您可能想考虑在 Mongo 中不区分大小写的搜索无法有效完成。必须评估任何文件。以原始格式和您认为更易于搜索的任何格式存储数据是很常见的,例如转换为小写字母时会出现 Unicode 字符出现的所有问题。

标签: java spring mongodb spring-data spring-data-mongodb


【解决方案1】:

^ 开头,$ 结尾

Aggregation aggregation = newAggregation( match(Criteria.where("fieldName").regex("^"+searchText+"$","i")) );

【讨论】:

    【解决方案2】:

    在mongo db中使用文本搜索,请使用2.6+版本

    【讨论】:

      【解决方案3】:

      我刚刚尝试了以下方法,它对我有用。

       @Query(value = "{'name': {$regex : '^?0$', $options: 'i'}}")
          List<Item> findItemsByNameRegexExactMatch(String name);
      

      【讨论】:

      • 这看起来很有帮助。
      【解决方案4】:

      最简单的方法可能是这样的:

      interface UserRepository extends Repository<User, BigInteger> {
      
         List<User> findByUsernameIgnoreCase(String username);
      }
      

      【讨论】:

      • 实现在哪里。你能解释一下这是如何工作的吗?
      • @KanagaveluSugumar 实际上没有实现。您可以阅读有关 Spring Data Repositories 以及“神奇”方法如何工作的信息。
      猜你喜欢
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多