2012-07-28 14 views
13

私はspringを使用してmongodbを照会しようとしています。ツリーを保持するコレクションがあり、アイテムのリストをツリーパスとしてインクルードします(ツリーを簡単にトラバースできるように)。特定のノードのすべての子ノードを返す必要があるクエリがあります。私たちのクエリは、パス内のノード(親)を持ち、親(レベル)より1レベル低いすべてのノードを選択することに基づいています。次のように私たちの基準は次のとおりです。同じフィールドを2回クエリするSpring 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"]}'が含まれています。

同じことを達成するための他の提案はありますか?私が考えていた1つの選択肢は、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

+0

orOperatorを使用すると、同じフィールドの異なる値を照会することもできます(必要な場合)。 – hypercube

関連する問題