2016-03-01 89 views
0

我們構建了一個Document模式,其中作業文檔由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]}, 
] 

「A」是「在」項目3的父是項目2,其父項目1.「B」是「在」項目4的父是計劃2仍具有項目1作爲其父項。項目5是另一個像項目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產品經理之一可以對此進行編輯。

此方法通常與NoSQL數據庫(如CouchDBMongoDB (combining materialized path and array of ancestors))一起使用,甚至支持陣列類型(如Postgres)的SQL數據庫。

相關問題