我有一个结构类似这样的集合:
{
"organization" : "Org1",
"active" : true,
"fields" : [
{
"key" : "key1",
"value" : "table"
},
{
"key" : "key2",
"value" : "Harrison"
}
]
}
我需要找到所有具有以下组织的文档:“ Org1”,active:true和regex匹配字段中的“值”。
在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);
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);
我在这里想念什么?我应该如何形成查询?
答案 0 :(得分:0)
您犯了一个非常小的错误,在传递/
的错误模式中,我花了半个小时才识别出它,最后,在启用spring boot的调试日志后得到了它。
对于第一个查询,应按以下方式调用:
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);
第二个查询中的相同问题,只需将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
我希望这可以解决您的问题。