2016-03-01 3 views
0

Мы построили схему документа, где документы задания уникально идентифицированы свойством Id, и представляют их ссылку на родителя с помощью свойства ParentJobId. Например:Рекурсивно запрашивать все связанные документы в DocumentDB

{ 
    "Type": "Request", 
    "StateName": "Success", 
    "id": "4365b7ec-6eee-468a-94f6-ab65d6434611", 
    "ParentJobId": null 
}, 
{ 
    "Type": "Machine", 
    "StateName": "ChildJobFailed", 
    "id": "27040208-add5-97e4-6bd2-d991de73c9b5", 
    "ParentJobId": "4365b7ec-6eee-468a-94f6-ab65d6434611" 
}, 
{ 
    "Type": "Application", 
    "StateName": "Error", 
    "id": "7ef36990-c321-81dd-a0c7-3b04fd64c86f", 
    "ParentJobId": "27040208-add5-97e4-6bd2-d991de73c9b5" 
} 

Как я могу запросить все документы, которые связаны с корнем родительской работы?

ответ

0

В 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.

Смежные вопросы