Запрос критериев MongoTemplate

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

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

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

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

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

{ "field1" : { $java : org.springframework.data.mongodb.core.query.Criteria@23864e60 } 

Итак, как добиться точного запроса, который мне нужен? Я не могу жестко запрограммировать эту строку запроса, потому что эти критерии типа генерируются динамически для field1,...fieldN, а затем объединяются с $or:

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

person Aeteros    schedule 05.11.2015    source источник


Ответы (2)


Поскольку вы не можете использовать 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);
}
person chridam    schedule 05.11.2015
comment
Это генерирует следующий блок { $and : [ { field : { $exists : true}} , { field : { $ne : false}}]} это не совсем то, что мне нужно, но логически это так. Не приведет ли это к проблемам с производительностью из-за удвоения поля? - person Aeteros; 05.11.2015
comment
@Aeteros Никаких проблем с производительностью. Из документов MongoDB предоставляет неявную AND операцию при указании список выражений, разделенных запятыми. Использование явного AND с оператором $and необходимо, когда одно и то же поле или оператор должны быть указаны в нескольких выражениях. - person chridam; 05.11.2015
comment
@chridam - большое спасибо. Ваше решение сработало отлично. гр8 работа!! - person Srikumar Krishna Iyer; 22.01.2021

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

Или, если field1 всегда является логическим значением, когда присутствует:

Query query = new Query(Criteria.where("field1").is(true));
person Claus Nielsen    schedule 24.08.2018