2015-06-14 64 views
1

嵌入式鏈接給出了類似的架構羣衆爲:如何加入使用rethinkdb

[{ 
    "id": 1, 
    "name": "Darth", 
    "family": [2,3] 
}, 
    { 
    "id": 2, 
    "name": "Luke" 
    }, 
    { 
    "id": 3, 
    "name": "Leia" 
    } 
] 

我怎麼回達斯和外部連接得到他所有的家人嗎?

回答

1

我想要family中的ID替換爲家庭成員的文檔,您可以使用get執行map

像這樣:

r.table('people').get(1) // Get Darth 
    // Add a `family` property to Darth 
    .merge(function (row) { 
    return { 
     // Map all the family member ids to their respective documents 
     'family': row('family').map(function (id) { 
     return r.table('people').get(id); 
     }) 
    } 
    }) 

此查詢的結果將是什麼這樣的:

{ 
    "family": [ 
    { 
     "id": 2 , 
     "name": "Luke" 
    } , 
    { 
     "id": 3 , 
     "name": "Leia" 
    } 
    ] , 
    "id": 1 , 
    "name": "Darth" 
} 
+0

謝謝豪爾赫。這會導致在重新合併或在合併的函數內觸發單獨查詢的連接嗎?在獲取單個文檔時還可以,但是如果不使用get(1)就像SELECT n + 1查詢那樣可能是災難性的 – Chev

+0

這些是索引字段上的點讀取,所以性能應該非常好。顯然這取決於你正在做的文件數量以及你的文件中每個文件的數量。如果你發佈了更多關於你想要完成的背景信息,我可能會幫助你多一點。 –

+0

感謝您的反饋Jorge – Chev

1

結束了下面這將是比地圖我相信更高性能。它會使用默認索引ID

r.db('myDb') 
    .table('tests') 
    .get(1) 
    .merge(function (person) { 
    return { 
     myFamily: r.db('myDb').table('tests').getAll(r.args(person('family'))).coerceTo('ARRAY') 
    } 
    }) 
    .pluck('name', 'myFamily'); 
+0

令人驚訝的是,這與'get'與'get'之間的區別可以忽略不計,因爲它們幾乎都是索引操作並且具有'getAll',數據庫必須遍歷B-Tree中的幾個無論如何,當做這些點讀。對於非常大的表格,使用'getAll'可能會更快,但它可能不會有太大的區別。 –

+0

請記住,這些查詢是在數據庫中完全執行的,這意味着在數據庫中,'getAll'的操作與'map'和'get'沒有什麼不同,因爲您將整個查詢發送到一旦它不需要進行多次往返執行查詢。 –