2015-09-19 31 views
0

在RethinkDB網站的concatMap api頁面上,它表示eqJoin是用concatMap + getAll實現的,它應該比其他連接提供更好的性能。執行嵌套concatMap以實現連接多個表的最佳方法是什麼?

在我的情況下,我想加入多個表格,這裏是一個例子,我們假設我有3個表格,usersdepartmentscompanies。在每個user文檔中將包含department idcompany id。例如:

var user = { 
    name: 'Peter', 
    company: '12345', 
    department: '8888', 
    otherDetails: 'abc 123' 
} 

的結果,我想以後連接查詢得到的是非常相似concatMap/eqJoin的結果,但所有3個表:

[{ 
    user: {...}, 
    company: {...}, 
    department: {...} 
}, ...] 

這裏是一個查詢我已經寫了可以得到的結果是:

r.table('users') 
    .concatMap(function(user) { 
    return r.table("companies").getAll(
     user("company") 
    ).map(function(company) { 
     return { user: user, company: company } 
    }) 
    }) 
    .concatMap(function(row) { 
    return r.table("departments").getAll(
     row("user")("department") 
    ).map(function(department) { 
     return { user: row("user"), company: row("company"), department: department } 
    }) 
    }) 

我的問題:

  1. 有沒有更好的方法來做到這一點?
  2. 上述查詢的性能仍然和平常一樣好2個表上的eqJoin?
  3. 在這些情況下使用合併的性能比使用eqJoin(concatMap)差得多嗎?

非常感謝。

回答

0
  1. 這看起來是最好的方式來做到這一點。如果你想要,你可以將第二個concatMap移動到第一個.concatMap(所以你把它鏈接到getAll的末尾)。這可能會更快,你必須找出基準,但它應該大致相同的速度。

  2. 是的,應該是。

  3. 我不認爲你可以通過合併來完成這項任務。任何時候您想要將一個輸入行變成多個輸出行,您需要使用concatMap或連接。如果不是每個用戶/公司/部門對的一個輸出文檔,而是每個用戶需要一個輸出文檔以及其中的公司和部門的陣列,那麼可以使用merge作爲輸出文檔,並且應該大致相同(或者只是一點點更快)。

+0

非常感謝Michael! // 1.我將'concatMap's一起移動,因爲它會更短(只有一個'map'),並且對我更加一致(map中的變量)// 2.完美! // 3.我明白你的意思,'concatMap'正在返回我現在需要的這種情況。在RethinkDB上閱讀更多關於'merge'和'concatMap'的東西,並且在再次尋求幫助之前先思考我要做的事情。 //再次感謝您的快速回答! :) – oldlam

相關問題