2015-11-16 2 views
0

У меня есть три стола: user, post, postVote.Как вы присоединяетесь к трем или более таблицам в RethinkDB?

Я хочу объединить эти таблицы, чтобы построить список сообщений для текущего пользователя сеанса. vote Поле каждого элемента сообщения в списке результатов будет отличаться в зависимости от того, кем является текущий пользователь сеанса и для каждого элемента сообщения. Подумайте, как работает reddit голосование.

Я добавил составной индекс ['userId', 'postId'] как userIdpostId в postVote таблица для более быстрого eqJoin.

Вот таблица схемы:

user { 
    id: string 
    name: string 
} 

post { 
    id: string 
    authorId: string 
    title: string 
} 

postVote { 
    id: string 
    userId: string 
    postId: string 
    vote: number 
} 

Желаемый результат:

[ 
    { 
    id: string // post id 
    authorId: string // author user id 
    authorName: string // author user name 
    title: string // post title 
    vote: number // vote for this post by current session user 
       // default to 0, if no matching entry is found in postVote table. 
    } 
] 

ответ

2

Я думаю, что это может сделать трюк.

r.table("postVotes") 
    .eqJoin("authorId", r.table("users")) 
    .eqJoin(r.row("left")("postId"), r.table("posts")) 
    .map(function(doc){ 
     //...clean up doc as necessary... 
    }).run() 

В конце концов, вы должны иметь документ с left и right ключом в самом верхнем слое, а потом еще и leftright содержали в качестве верхнего значения наиболее left. Выполнение .map в конце позволит вам очистить его до желаемого результата JSON.

Это немного приближенное, так как у меня нет вашего набора данных, но дайте мне знать, если у вас есть вопросы.

Смежные вопросы