【发布时间】: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);
- 这个没有提供任何文件,即使它应该提供。
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