2015-11-05 122 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