1

对于“会话”,我有这样的结构:

{
  "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")
)

但是,此查询将仅检索当前有预订的会话。我想获得所有会话,同时还为那些有预订的会话执行加入。有没有办法用一个查询来做到这一点,或者我只需要在第一个查询之后执行第二个查询就可以无保留地获取会话?我是否需要对数据进行不同的建模?

4

1 回答 1

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
        }
})
于 2014-04-22T23:43:20.777 回答