【问题标题】:Spring data mongo query with regex within an array在数组中使用正则表达式进行 Spring 数据 mongo 查询
【发布时间】:2019-11-23 12:26:28
【问题描述】:

我有一个结构有点像这样的集合:

{  
  "organization" : "Org1",  
  "active" : true,  
  "fields" : [  
  {  
    "key" : "key1",  
    "value" : "table"   
  },  
  {  
    "key" : "key2",  
    "value" : "Harrison"  
  }  
  ]  
}  

我需要找到所有具有组织的文档:“Org1”,活动:true,并且正则表达式匹配字段中的“值”。

在 mongo shell 中,它可以完美运行。我试过查询:

db.collection.find({"organization" : "Org1", "active" : true, "fields" : {$elemMatch : {"key" : "key2","value" : {$regex : /iso/i}}}}).pretty()

但是当我尝试使用 Spring 将其转换为 Java 代码时,它给出了错误的结果。
1.这个即使不匹配模式也会给文档:

@Query("{'organization' : ?0, 'active' : true, 'fields' : {$elemMatch : {'key' : ?1, 'value' : {$regex : ?2}}}}")
List<ObjectCollection> findFieldDataByRegexMatch(String org, String key, String pattern);  
  1. 这个没有提供任何文件,即使它应该提供。
        MongoTemplate MONGO_TEMPLATE = null;
        try {
            MONGO_TEMPLATE = multipleMongoConfig.secondaryMongoTemplate();
        } catch (Exception e) {
            e.printStackTrace();
        }

        List<Criteria> criteriaListAnd = new ArrayList<Criteria>();
        Criteria criteria = new Criteria();
        String pattern = "/iso/i";

        criteriaListAnd.add(Criteria.where("organization").is("Org1"));
        criteriaListAnd.add(Criteria.where("active").is(true));
        criteriaListAnd.add(Criteria.where("fields").elemMatch(Criteria.where("key").is(key).and("value").regex(pattern)));
        criteria.andOperator(criteriaListAnd.toArray(new Criteria[criteriaListAnd.size()]));

        Query query = new Query();
        query.addCriteria(criteria);

        List<ObjectCollection> objects = MONGO_TEMPLATE.find(query, ObjectCollection.class);

我在这里遗漏了什么,我应该如何形成我的查询?

【问题讨论】:

  • 我认为active 属性"active": "true" 的值存储为string,即"true",在查询中,您将作为布尔值作为true 传递。
  • 活动属性是我数据库中的布尔值。我将编辑帖子。
  • 问题很奇怪,我刚刚检查了通过启用调试日志打印的查询与您在 mongo shell 上运行的字符串不同,问题出在正则表达式部分,即正则表达式部分是字符串.即导致问题的{ "$regex" : "/iso/i" },一旦删除字符串表示法,即从"/iso/i"/iso/i,它在mongo shell 终端和spring 应用程序上都可以正常工作。
  • 请检查答案,它会解决你的问题。

标签: regex spring mongodb mongodb-query spring-data-mongodb


【解决方案1】:

你犯了一个很小的错误,在你传递/的模式中是错误的,我花了半个小时才发现它,终于在启用spring boot的调试日志后得到它。

  1. 对于第一个查询,应该如下调用:

    springDataRepository.findFieldDataByRegexMatch("Org1", "key2", "iso")
    

    并且应该在存储库中修改查询以处理大小写:

    @Query("{'organization' : ?0, 'active' : true, 'fields' : {$elemMatch : {'key' : ?1, 'value' : {$regex : ?2, $options: 'i'}}}}")
    List<Springdata> findFieldDataByRegexMatch(String org, String key, String pattern);
    
  2. 第二个查询也出现同样的问题,只需将 String pattern = "/iso/i"; 更改为 String pattern = "iso"String pattern = "iso.*" ;

两者都将开始工作,有关详细信息,请查看我的 GitHub 存储库https://github.com/krishnaiitd/learningJava/blob/master/spring-boot-sample-data-mongodb/src/main/java/sample/data/mongo/main/Application.java#L60

我希望这能解决您的问题。

【讨论】:

  • 1.第一个查询仍然给出错误的结果。但是,它在 shell 中正常工作 2。第二个查询完美运行。
  • @IraSinha 您可以在第一个查询中尝试使用"iso.*"
猜你喜欢
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 2018-09-04
  • 2015-08-25
  • 2018-07-25
  • 1970-01-01
相关资源
最近更新 更多