0

嗨,我正在使用带有 rethinkdb 的 javascript,并且我试图弄清楚当目标的 id 不在主表上而是在第二个表上时如何使用 eqJoin。

网站上的示例显示了这一点。

first table /players
[{name: 'anna', gameID:1}]

second table /games
[{id: 1, gameName: 'supergame'}]

但我想加入的是这个

first table / players
[{id 1, name: 'anna'}]

second table / games
[{playerID: 1, gameName:'supergame'},
 {playerID: 1, gameName:'megagame'},
 {playerID: 1, gameName:'lamegame'}]

我已经阅读了一些关于 concatMap 的内容并尝试了这个,但这显然给了我错误,还有其他方法吗?

如果有的话,我什至可以加入更多的桌子吗?

r.table("players").concatMap(function(play) {
    return r.table("games").getAll(
        play("id"),
        { index:"playerID" }
    ).map(function(games) {
        return { left: play, right: games }
    })
}).run(conn, callback)
4

2 回答 2

1

右边的表必须在你得到的字段上有一个索引。playerID从您的第二个示例中看起来您已经有了索引games;如果是这种情况,那么您应该能够将其指定index: 'playerId'eqJoin. 类似的东西r.table('players').eqJoin('id', r.table('games'), {index: 'playerId'})

如果该索引存在,您可以使用indexCreate它来创建它。

于 2016-01-14T19:46:30.840 回答
0

在 slack.rethinkdb.com 的帮助下,我得到了这个很好的答案。这也将匹配的对象放在对象上的树中

r.db('test').table("players").map(function(play){ 
    return play.merge({ "games": r.db('test').table("games").getAll(trans("id"), {"index": "playerID"}).coerceTo("ARRAY")}); 
})
于 2016-01-14T21:03:18.840 回答