2012-07-28 3 views
13

Ich versuche, Mongodb mit Feder abzufragen. Wir haben eine Sammlung, die einen Baum enthält und eine Liste von Elementen als Baumpfad enthält (damit wir den Baum leicht durchqueren können). Wir haben eine Abfrage, die alle untergeordneten Knoten eines bestimmten Knotens zurückgeben muss. Unsere Abfrage basiert auf der Auswahl aller Knoten, die den Knoten (Eltern) im Pfad haben und eine Ebene niedriger als die Elternebene (Ebene) sind. Unsere Kriterien sind wie folgt:Spring Mongo-Kriterien Abfrage zweimal das gleiche Feld

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

Ach, wenn wir dies auf mongodb nennen bekommen wir die folgende Ausnahme:

org.springframework.data.mongodb.InvalidMongoDbApiUsageException: Wegen der Beschränkungen des com .mongodb.BasicDBObject, Sie können keinen zweiten Ausdruck 'treePath' hinzufügen, der als 'treePath: {"$ size": 2} angegeben wurde. Die Kriterien enthalten bereits 'treePath: {"$ in": [ "50137df5f49f9b4a6481d639"]}'.

Gibt es weitere Vorschläge, wie Sie dasselbe erreichen können? Eine Option, an die ich dachte, war, mongodb direkt abzufragen. Ich versuchte

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

Aber das wird nur den ersten Datensatz aktualisieren und ich brauche sie alle aktualisiert.

Danke!

Antwort

24

Dies wird tun, was Sie wollen:

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()); 

Er druckt

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

Dank! hat super funktioniert! – checklist

+0

Mit orOperator können Sie auch nach anderen Werten des gleichen Felds suchen, wenn dies erforderlich ist. – hypercube

Verwandte Themen