Criteria::in方法を使用して、すべての要素の上に代わりに反復のリストを渡すと、要素ごとにチェックしないのはなぜ、私はあなただけでこれを必要だと思います最初の方法は、1つのフィールドがリストの値の1つを保持できるかどうかを確認したい場合には機能しますが、問題は異なると思われます。この問題を解決するために、あなたは使用することができます:
//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の2番目の '$ or'式に$または:[{"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"}]}
「OR」リクエストが必要ですか? 'where crit1 OR crit2 OR crit3' – AxelH