RethinkDB条件连接

时间:2014-04-22 23:21:03

标签: node.js rethinkdb

我有一个这样的结构,用于'会议':

{
  "created_at": Tue Apr 22 2014 23:10:52 GMT+00:00 ,
  "id":  "960e9a45-9a06-43c5-be7f-9144ee3f67c8" ,
  "scheduled_time": Wed Apr 23 2014 02:00:00 GMT+00:00 ,
  "reservation": {
    "created_at": Mon Apr 21 2014 03:00:26 GMT+00:00 ,
    "student_id":  "8be76323-98ce-488e-9164-611663bc17ec"
  }
}

我可以通过以下方式轻松地在reservation.student_id上执行加入:

r.table('sessions').eqJoin(
  r.row('reservation')('student_id'), 
  r.table('users')
)

我的问题是会话不一定被保留,只有学生实际保留会话后才会添加该属性。因此,如果表中存在任何无法预订的会话,Rethink会告诉我No attribute 'reservation' in object

IRC的某人建议如下:

r.table('sessions').withFields("reservation").eqJoin(
    r.row("reservation")("student_id"), 
    r.table("users")
)

但是,此查询将仅检索当前具有预留的会话。我希望获得所有会话,同时还为那些有预订的会话执行联接。有没有办法用一个查询来完成这个,或者我只需要在第一个查询之后执行第二个查询而无需保留就能获取会话?我需要以不同方式对数据建模吗?

1 个答案:

答案 0 :(得分:3)

输出与eqJoin略有不同,但这对您有用吗?

r.table('sessions').map(function(session) {
    return r.branch(
        session.hasFields("reservation"),
        {
            session: session,
            reservations: r.table("users").getAll(session("reservation")("student_id")).coerceTo("ARRAY")
        },
        {
            session: session
        }
})