使用concatMap连接表

时间:2016-06-25 15:03:34

标签: rethinkdb rethinkdb-javascript

r.table('users').hasFields('name').concatMap(function(user) {
    return r.table("bets").getAll(
        user('userID'),
        { index: "userID" }
    ).map(function(bet) {
        return { left: user, right: bet }
    })
})

目标:阅读所有用户及其投注。所有赌注应该在一个数组中。

{
  "left": {
    "name": "Eki95",
    "userID": "525dc15b-ebde-464b-a936-bab4ed7e4965"
  },
  "right": [{
    "id": "4987c183-edc1-4cd0-9c8d-f51357b86908",
    "bet": "foo",
    "userID": "525dc15b-ebde-464b-a936-bab4ed7e4965",
  },
  {
    "id": "18e95569-107f-4182-85c1-7df269880978",
    "bet": "bar",
    "userID": "525dc15b-ebde-464b-a936-bab4ed7e4965",
  },
  ]
}

我真正得到的是:

{
  "left": {
    "name": "Eki95",
    "userID": "525dc15b-ebde-464b-a936-bab4ed7e4965"
  },
  "right": {
    "bet": "foo",
    "id": "4987c183-edc1-4cd0-9c8d-f51357b86908",
    "userID": "525dc15b-ebde-464b-a936-bab4ed7e4965",
  }
},


{
  "left": {
    "name": "Eki95",
    "userID": "525dc15b-ebde-464b-a936-bab4ed7e4965"
  },
  "right": {
    "bet": "bar",
    "id": "18e95569-107f-4182-85c1-7df269880978",
    "userID": "525dc15b-ebde-464b-a936-bab4ed7e4965",
  }
},

我可以通过循环所有条目来获得我的结果,这是一种痛苦。有没有办法在rethinkdb中使用查询来执行此操作?

2 个答案:

答案 0 :(得分:1)

您可能需要以下内容:

r.table('users').hasFields('name').map(function(user) {
  return {
    left: user,
    right: r.table('bets').getAll(user('userID'), {index: 'userID'}),
  };
})

答案 1 :(得分:0)

感谢https://stackoverflow.com/users/3200554/mlucy,我可以让它发挥作用:

r.table('users').hasFields('name').map(function(user) {
    return {
        user: user,
        bets: r.table('bets').getAll(user('userID'), {index: 'userID'}).coerceTo('array'),
    };
}

我不得不稍微调整一下查询并添加coerceTo('array'),否则它会抛出一个

  

ReqlQueryLogicError:预期类型为DATUM,但找到了SELECTION

异常。