2014-09-30 54 views
0

我有兩個表如下一個主機和一個用戶。RethinkDB表加入

主持人:

{ 
     "host": "server1", 
     "address": "192.168.1.22", 'users': ["Magneto", "Professor Xavier", "Storm"] 
    }, 
    { 
     "host": "server2", 
     "address": "192.168.1.23", 'users': ["Storm"] 
    }, 
    { 
     "host": "server3", 
     "address": "192.168.1.24", 'users': ["Magneto", "Storm"] 
    } 

用戶:

{ 
     "hero": "Magneto", 
     "name": "Max Eisenhardt", 
     "aka": ["Magnus", "Erik Lehnsherr", "Lehnsherr"], 
     "magazine_titles": ["Alpha Flight", "Avengers", "Avengers West Coast"] 
    }, 
    { 
     "hero": "Professor Xavier", 
     "name": "Charles Francis Xavier", 
     "magazine_titles": ["Alpha Flight", "Avengers", "Bishop", "Defenders"] 
    }, 
    { 
     "hero": "Storm", 
     "name": "Ororo Monroe", 
     "magazine_titles": ["Amazing Spider-Man vs. Wolverine", "Excalibur", 
      "Fantastic Four", "Iron Fist"] 
    } 

我試圖創建一個從主機連接查詢,以獲得用戶最終得到這樣的事情對於每個服務器。基本上將用戶數據組合到服務器文檔中。例如

{ 
"host": "server3", 
"address": "192.168.1.24", 
"users": [ 
    { 
     "hero": "Storm", 
     "name": "Ororo Monroe", 
     "magazine_titles": [ 
      "Amazing Spider-Man vs. Wolverine", 
      "Excalibur", 
      "Fantastic Four", 
      "Iron Fist" 
     ] 
    }, 
    { 
     "hero": "Magneto", 
     "name": "Max Eisenhardt", 
     "aka": [ 
      "Magnus", 
      "Erik Lehnsherr", 
      "Lehnsherr" 
     ], 
     "magazine_titles": [ 
      "Alpha Flight", 
      "Avengers", 
      "Avengers West Coast" 
     ] 
    } 
] 
} 

由於用戶包含服務器「用戶」內陣,我不能完全工作了我應該怎麼在這裏進行我的查詢?

這是我做過嘗試,但至今沒有運氣:

r.db('data').table("hosts") 
.concatMap(function (x) { 
    return x("users").map(function (usr) { 
    return x.merge({users: usr}); 
}); 
}).eqJoin("users", r.db('data').table("users")) 

回答

1

hero第一

r.db('data').table('users').indexCreate("hero") 

r.db('data').table("hosts").merge(function(host) { 
    return { 
     users: r.table("users").getAll(r.args(host("users")), {index: "hero"}).coerceTo("ARRAY") 
    } 
}) 

創建索引如果數組users可能是空的,你需要添加一個如果陳述與r.branch

r.db('data').table("hosts").merge(function(host) { 
    return r.branch(
     host("users").isEmpty(), 
     {}, 
     { 
       users: r.table("users").getAll(r.args(host("users")), {index: "hero"}).coerceTo("ARRAY") 
     } 
    ) 
})