嵌入式鏈接給出了類似的架構羣衆爲:如何加入使用rethinkdb
[{
"id": 1,
"name": "Darth",
"family": [2,3]
},
{
"id": 2,
"name": "Luke"
},
{
"id": 3,
"name": "Leia"
}
]
我怎麼回達斯和外部連接得到他所有的家人嗎?
嵌入式鏈接給出了類似的架構羣衆爲:如何加入使用rethinkdb
[{
"id": 1,
"name": "Darth",
"family": [2,3]
},
{
"id": 2,
"name": "Luke"
},
{
"id": 3,
"name": "Leia"
}
]
我怎麼回達斯和外部連接得到他所有的家人嗎?
我想要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"
}
結束了下面這將是比地圖我相信更高性能。它會使用默認索引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');
令人驚訝的是,這與'get'與'get'之間的區別可以忽略不計,因爲它們幾乎都是索引操作並且具有'getAll',數據庫必須遍歷B-Tree中的幾個無論如何,當做這些點讀。對於非常大的表格,使用'getAll'可能會更快,但它可能不會有太大的區別。 –
請記住,這些查詢是在數據庫中完全執行的,這意味着在數據庫中,'getAll'的操作與'map'和'get'沒有什麼不同,因爲您將整個查詢發送到一旦它不需要進行多次往返執行查詢。 –
謝謝豪爾赫。這會導致在重新合併或在合併的函數內觸發單獨查詢的連接嗎?在獲取單個文檔時還可以,但是如果不使用get(1)就像SELECT n + 1查詢那樣可能是災難性的 – Chev
這些是索引字段上的點讀取,所以性能應該非常好。顯然這取決於你正在做的文件數量以及你的文件中每個文件的數量。如果你發佈了更多關於你想要完成的背景信息,我可能會幫助你多一點。 –
感謝您的反饋Jorge – Chev