2015-11-05 106 views
1

我正在根据多个参数生成一个复杂的mongo查询。标准的一个,我想和标准辅助类是: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的字段N ...,然后用$或组合:

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

产生以下块{ “$和”:[{ “字段”:{ “$存在”:真}},{ “字段”:{“$ NE “:false}}]}这并不完全是我需要的,但从逻辑上讲它是。由于“场地”翻倍,会不会导致性能问题? – Aeteros

+1

@Aterteros根本没有性能问题。从[docs](https://docs.mongodb.org/manual/reference/operator/query/and/)中,当指定逗号分隔的表达式列表时,MongoDB提供隐式的AND操作。当需要在多个表达式中指定相同的字段或运算符时,使用带'$和'运算符的显式'AND'是必需的。 – chridam