为什么不使用 Criteria::in 方法并传递一个 List 而不是迭代所有元素并逐个检查元素,我认为您只需要这个:
query.addCriteria(
Criteria.where("data." + fieldName).in(fieldArray)
);
除了@Veeram 的评论之外,如果您想检查一个字段是否可以保存列表中的一个值,第一种方法将起作用,但您的问题似乎不同,据我所知,您想检查一个在多个字段中退出值,您可以使用来解决此问题:
//Consider you want to check in multiple fields
List<String> fieldArray = Arrays.asList("field1", "field2", "field3");
// First you have to create a list of Criteria (multiple conditions)
List<Criteria> listOfCondition = new ArrayList<>();
for (String fieldName : fieldArray) {
listOfCondition.add(
Criteria.where("data." + fieldName).is("some_constant")
);
}
//The add them to the query.
Criteria criteria = new Criteria();
for (Criteria c : listOfCondition) {
criteria = criteria.orOperator(c);
}
Query query = new Query();
query.addCriteria(criteria);
//Then execute your query just one time
您可以使用流:
List<String> fieldArray = Arrays.asList("field1", "field2", "field3");
Criteria principaleCriteria = new Criteria();
fieldArray.stream()
.map(fieldName -> Criteria.where("data." + fieldName).is("some_constant"))
.forEach(criteria -> principaleCriteria.orOperator(criteria));
Query query = new Query();
query.addCriteria(principaleCriteria);
return mongoTemplate.count(query, DataPoint.class) > 0;
虽然在技术上是正确的,但当你运行代码时你会得到
org.springframework.data.mongodb.InvalidMongoDbApiUsageException:到期
由于 com.mongodb.BasicDBObject 的限制,您不能添加
第二个 '$or' 表达式指定为 '$or : [ { "data.field2" :
“一些常数”}]'。条件已经包含 '$or : [ { "data.field1"
: "some_constant"}]'。
Mongodb 兼容代码:
List<String> fieldArray = Arrays.asList("field1", "field2", "field3");
Criteria principaleCriteria = new Criteria();
List<Criteria> orExpressions = fieldArray.stream()
.map(fieldName -> Criteria.where("data." + fieldName).is("some_constant"))
.collect(toList());
Query query = new Query();
query.addCriteria(principaleCriteria.orOperator(orExpressions.toArray(new Criteria[orExpressions.size()])));
输出:
{ "$or" : [ { "data.field1" : "some_constant"} , { "data.field2" : "some_constant"} , { "data.field3" : "some_constant"}]}