RavenDB中的遞迴索引
阿新 • • 發佈:2018-12-29
在這篇文章中,我想展示另一種處理相同問題的方法,但不使用圖形查詢並僅使用我們在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_groups(accumulator,grpId){
如果(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的核心原則之一是,您可以將更多工作推向索引,並使您的查詢快速而簡單。這是我們如何以這樣一種方式安排資料的一個很好的例子,我們可以以非常優雅的方式將工作推送到後臺索引。