Подтвердить что ты не робот

Spring критерии Mongo, запрашивающие дважды одно и то же поле

Я пытаюсь запросить mongodb с помощью spring. У нас есть коллекция, которая содержит дерево и включает список элементов как путь к дереву (поэтому мы можем легко пересечь дерево). У нас есть запрос, который должен возвращать все дочерние узлы определенного node. Наш запрос основан на выборе всех узлов с node (parent) в пути и на один уровень ниже родительского (уровня). Наши критерии заключаются в следующем:

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

Увы, когда мы называем это на mongodb, получаем следующее исключение:

org.springframework.data.mongodb.InvalidMongoDbApiUsageException: Due к ограничениям com.mondod.BasicDBObject, вы не можете добавить второе выражение 'treePath', указанное как 'treePath: { "$ size": 2}'. Критерии уже содержат '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);

Но это только обновит первую запись, и мне все они будут обновлены.

Спасибо!

4b9b3361

Ответ 1

Это сделает то, что вы хотите:

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}}]}