В DocumentDB нет способа сделать это в одном запросе. Вы могли бы, конечно, рекурсивно пройтись по дереву с несколькими круговыми поездками. Вы могли бы даже сделать это в одном раунде в хранимую процедуру, которую вы написали, которая выполняла несколько запросов.
Однако я обнаружил, что лучший способ моделирования иерархии (деревьев) для быстрого поиска в базах данных NoSQL - это массив, содержащий materialized path. Посмотрите на следующем примере:
documents = [
{id: 'A', hierarchy: [1, 2, 3]},
{id: 'B', hierarchy: [1, 2, 4]},
{id: 'C', hierarchy: [5]},
{id: 'D', hierarchy: [1, 6]},
]
«А» есть «в» Проекте 3 которого родитель Проект 2, чей родитель 1. Проект «Б» является «в» Проекте 4 которого родитель Проект 2, который все еще имеет Проект 1 является его родителем. Проект 5 - еще один корневой проект, такой как Project 1; и "D" является "в" Проекте 6, который является потомком проекта 1.
Теперь отправить в запросе, как это:
SELECT * FROM c WHERE ARRAY_CONTAINS(c.hierarchy, 1)
Она возвращает документы A, B и D. Попробуйте:
SELECT * FROM c WHERE ARRAY_CONTAINS(c.hierarchy, 2)
это просто возвращает документы A и B.
Одно слово предостережения, хотя, я не знаю, как производительный этот подход в DocumentDB, который я не думаю, что позволяет индексы по полям массива , Возможно, один из менеджеров продуктов DocumentDB, которые контролируют Stack Overflow, может прослушивать это.
Этот подход обычно используется с базами данных NoSQL, такими как CouchDB и MongoDB (combining materialized path and array of ancestors), и даже SQL-базами данных, поддерживающими типы массивов, такие как Postgres.