1. 程式人生 > >RavenDB中的遞迴索引

RavenDB中的遞迴索引

在這篇文章中,我想展示另一種處理相同問題的方法,但不使用圖形查詢並僅使用我們在RavenDB 4.1中的功能。

我的想法是,給定一個使用者,我希望能夠通過一個組(如Max,via project-x group)直接(如圖中的Sunny)發出查詢,以查詢該使用者可以訪問的所有問題。 )或通過遞迴組,如(Nati,通過project-x - > team-nati groups)。

從這篇文章的名稱可以想象,這需要遞迴。你可以閱讀有關這方面的文件,但我想要把事情搞清楚,並同時使用幾個功能。

讓我們看看以下索引(問題/許可權):

//問題/許可權索引定義
 
map(“Issues”
issue => {
   var  groups  =  issue。團體。reduce(recurse_groups,{});
   return   { Groups:Object。鍵(),使用者:問題。使用者 };
});
 
function  recurse_groupsaccumulatorgrpId){
    如果GRPID  ==   ||  累加器。hasOwnProperty(GRPID))
        返回 累加器 ;
    accumulator [ grpId ] =  null ;
    var 
grp = load(grpId“Groups”);
    如果GRP  ==   ||  GRP。家長 ==  
        返回 累加器 ;
    返回 grp。父母。reduce(recurse_groups,accumulator);
}

這是一個JS索引,它在Issues集合上有一個map()函式。對於每個問題,我們為問題的使用者和允許訪問它的組(遞迴地)編制索引。

以下是此索引的輸出對於圖中的問題:

圖片

現在讓我們來看看我們如何查詢這個,不是嗎?

查詢兩個子句

該查詢有兩個子句; 我們是直接分配還是通過小組分配。這裡的關鍵是在recurse_groups

()和裡面,在索引中呼叫load()。它向上掃描已定義的組及其父項,直到我們在索引中有一個易於搜尋的簡單結構。

RavenDB將確保每當索引中的load()引用的文件更新時,引用它的所有文件都將被重新編制索引。在我們這裡的情況下,每當更新組時,我們將重新索引所有相關問題以匹配新的許可權結構。

RavenDB的核心原則之一是,您可以將更多工作推向索引,並使您的查詢快速而簡單。這是我們如何以這樣一種方式安排資料的一個很好的例子,我們可以以非常優雅的方式將工作推送到後臺索引。