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);
ただし、これは最初のレコードのみを更新するため、すべてを更新する必要があります。
ありがとう!