2015-11-05 2 views
1

Я создаю сложный запрос манго в зависимости от нескольких параметров. Одним из критериев, что я хочу сделать с Критерии вспомогательный класс является:Запрос критерия MongoTemplate

{"field1": {$exists: true, $ne: false}} 

Я пытался сделать это с:

Criteria.where("field1").is(Criteria.where("$ne").is(false).and("$exists").is(true)) 

Но он генерирует

{ "field1" : { $java : [email protected] } 

Так , как достичь точный запрос, который мне нужен? Я не могу жёстко этой строки запроса, так как этот criteions типа генерируется динамически для FIELD1 ... fieldN, а затем в сочетании с $ или:

statusCriteria = statusCriteria.orOperator(criterias.toArray(new Criteria[criterias.size()])); 

ответ

3

Поскольку вы не можете использовать Criteria.and() добавить несколько критериев в то же поле, использовать Criteria.andOperator() следующим образом:

Query query = new Query(); 
query.addCriteria(
    new Criteria().andOperator(
     Criteria.where("field1").exists(true), 
     Criteria.where("field1").ne(false) 
    ) 
); 

List<Foo> result = mongoTemplate.find(query, Foo.class); 
System.out.println("query - " + query.toString()); 

for (Foo foo : result) { 
    System.out.println("result - " + foo); 
} 
+0

, который генерирует следующий блок { "$ и": [{ "поле": { "$ существует": истинно}}, { "поле": { «$ пе ": false}}]} Это не совсем то, что мне нужно, но логично. Разве это не привело бы к проблемам с производительностью из-за удвоения «поля»? – Aeteros

+1

@Aeteros Нет проблем с производительностью. В [docs] (https://docs.mongodb.org/manual/reference/operator/query/and/) MongoDB предоставляет неявную операцию 'AND' при указании списка выражений, разделенных запятыми. Использование явного 'AND' с оператором' $ and' необходимо, когда одно и то же поле или оператор должны быть указаны в нескольких выражениях. – chridam