2012-07-28 68 views
13

我想查詢使用春天的mongodb。我們有一個包含樹的集合,並且包含一個項目列表作爲樹路徑(因此我們可以輕鬆遍歷樹)。我們有一個查詢需要返回特定節點的所有子節點。我們的查詢是基於選擇路徑中具有節點(父級)並且比父級(級別)低一級的所有節點。我們的標準如下:春季Mongo標準查詢兩次相同的字段

Criteria.where("treePath").in(parentId).and("treePath").size(level) 

唉,當我們把這種在MongoDB中,我們得到以下異常:

org.springframework.data.mongodb.InvalidMongoDbApiUsageException:由於 到COM的侷限性.mongodb.BasicDBObject,不能添加 指定爲'treePath:{「$ size」:2}''的第二個'treePath'表達式。 標準已包含'treePath:{「$ in」:[ 「50137df5f49f9b4a6481d639」]}'。

是否還有其他建議如何實現?我想到的一個選擇是直接查詢mongodb。我試過

String command = "{findAndModify:\"Task\",query:{$and:[{treePath:\"5013a79a36600872ecf4dba8\"},{treePath:{$size:2}},{order:{$gte:0}}]},update:{$inc:{order:1}}}"; 
CommandResult commandResult = mongoTemplate.executeCommand(command); 

但是這隻會更新第一條記錄,我需要它們全部更新。

謝謝!

回答

24

這會做你想要什麼:

int parentId = 100; 
int level = 5; 
Criteria c = new Criteria().andOperator(Criteria.where("treePath").is(parentId), 
             Criteria.where("treePath").size(level)); 
System.out.println(c.getCriteriaObject()); 

它打印

{ "$and" : [ { "treePath" : 100} , { "treePath" : { "$size" : 5}}]} 
+0

的感謝!非常棒! – checklist 2012-07-28 17:09:49

+0

使用orOperator,你也可以查詢同一個字段的不同值,如果這是你需要做的。 – hypercube 2017-04-14 18:08:32