Так что, если я правильно понял вопрос, вы хотите
- найти данный узел в дереве, данный
какой-то путь через часть
дерево к этому узлу плюс дополнительный запрос
выражения.
- затем верните этот узел и
все под ним.
С материализованными путями подход вы можете сделать выше. Главное, что нужно настроить, - это если путь к документу "a..b..c..d..e" и вы хотите найти документы с путем "..b..c..d. Как быстро это сделать. Если мы начинаем с самого верха, это легко. Однако здесь мы не. Возможно, имеет смысл использовать комбинированный подход, когда в документе есть материализованный путь для узла плюс массив предков узла, что-то вроде:
{ path : ",a,b,c,d,e,",
ancestor : ['a','b','c','d','e']
}
Мы могли бы индексировать по предкам, которые создадут индекс мультиключа. Затем мы выполняем запрос, подобный следующему, чтобы найти узлы на пути "... b, c, d ..." с некоторой эффективностью:
find( { path : /,b,c,d,/, ancestor : 'd', <more_query_expressions_optionally> } )
В приведенном выше примере будет использоваться индекс предка, и нужно проверять только документы, написанные "d". Можно попробовать следующее, что может быть даже лучше, в зависимости от того, насколько умен оптимизатор запросов:
find( { path : /,b,c,d,/, ancestor : { $all : ['a','d'] }, ... } )