MongoTemplate条件查询

14

我正在根据多个参数生成一项复杂的 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()]));
2个回答

38

由于无法使用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);
}

1
生成以下代码块 {"$and" : [ { "field" : { "$exists" : true}} , { "field" : { "$ne" : false}}]},虽然逻辑上是我需要的,但并不完全符合我的需求。这样重复使用“field”会导致性能问题吗? - Aeteros
2
@Aeteros 没有任何性能问题。根据文档,当指定逗号分隔的表达式列表时,MongoDB提供了一个隐式的AND操作。当需要在多个表达式中指定相同的字段或运算符时,使用显式的$and运算符是必要的。 - chridam
1
@chridam - 非常感谢你。你的解决方案完美地解决了问题。干得好!! - Srikumar Krishna Iyer

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

或者,如果field1在出现时总是一个布尔值:

Query query = new Query(Criteria.where("field1").is(true));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接