2012-07-28 79 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