如何检查该值是否等于列表中的至少一个字段?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查该值是否等于列表中的至少一个字段?相关的知识,希望对你有一定的参考价值。
我有这样的方法:
for (String fieldName : fieldArray) {
Query query = new Query();
query.addCriteria(Criteria.where("data." + fieldName).is("some_constant"));
if (mongoTemplate.find(query, DataPoint.class).size() > 0) {
return true;
}
}
return false;
这段代码看起来效率低下,因为它访问db这么多fieldArray的大小。
有没有办法用单个查询替换它?
在我看来,你可以使用public Criteria orOperator(Criteria... criteria)
它应该是这样的:
List<Criteria> criterias = new ArrayList<>();
for (String fieldName : fieldArray) {
//Create the criterias like you want
criterias.add(Criteria.where("data." + fieldName).is("some_constant"));
}
Query query = new Query(
new Criteria().orOperator(
criterias.toArray( //convert the list into an Criteria[] for the varargs parameter
new Criteria[criterias.size()]
)
)
);
这将创建一个Criteria
列表,用于生成Criteria实例,如果一个条件有效(OR操作,一个为true就足够了),该实例将有效。
为什么不使用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的限制,您无法添加第二个'$或'表达式,指定为'$或:[{“data.field2”:“some_constant” }]”。标准已包含'$或:[{“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"}]}
以上是关于如何检查该值是否等于列表中的至少一个字段?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Sqlalchemy ORM 中检查表中两个特定字段中的至少一个是不是为 NOT NULL? [复制]