18

springを使用してmongodbにクエリを実行しようとしています。ツリーを保持するコレクションがあり、ツリーパスとしてアイテムのリストが含まれています(ツリーを簡単にトラバースできるように)。特定のノードのすべての子ノードを返す必要があるクエリがあります。このクエリは、パスにノード(親)があり、親(レベル)より1レベル低いすべてのノードを選択することに基づいています。私たちの基準は次のとおりです。

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

残念ながら、これをmongodbで呼び出すと、次の例外が発生します。

org.springframework.data.mongodb.InvalidMongoDbApiUsageException:com.mongodb.BasicDBObjectの制限により、「treePath:{"$ size":2}」として指定された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);

ただし、これは最初のレコードのみを更新するため、すべてを更新する必要があります。

ありがとう!

4

1 に答える 1

29

これはあなたが望むことをします:

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}}]}
于 2012-07-28T13:28:42.243 に答える