Warum nicht Criteria::in Methode und eine Liste statt Iterate über das ganze Element passieren und Element überprüfen, indem Element, ich glaube, Sie brauchen nur das:
query.addCriteria(
Criteria.where("data." + fieldName).in(fieldArray)
);
Neben dem Kommentar von @Veeram der Der erste Weg funktioniert, wenn Sie überprüfen wollen, ob ein Feld einen der Werte in Ihrer Liste enthalten kann, aber es scheint, dass Ihr Problem anders ist, was ich verstehe, Sie wollen einen Wert in mehreren Feldern überprüfen, um dieses Problem zu lösen Sie können verwenden:
//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
Mit Streams können Sie verwenden:
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;
zwar technisch korrekt, wenn Sie den Code ausführen werden Sie
org.springframework.data.mongodb.InvalidMongoDbApiUsageException erhalten: Wegen Beschränkungen von com.mongodb.BasicDBObject können Sie keinen zweiten '$ oder' Ausdruck als hinzufügen, der als '$ oder: [{"data.field2": "some_constant"}] angegeben wurde. Die Kriterien enthalten bereits '$ oder: [{"data.field1" : "some_constant"}]'.
MongoDB konformen Code:
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()])));
Ausgänge:
{ "$or" : [ { "data.field1" : "some_constant"} , { "data.field2" : "some_constant"} , { "data.field3" : "some_constant"}]}
Sie wollen eine 'OR' Anfrage? 'where crit1 OR crit2 ODER crit3' – AxelH