【问题标题】:RethinkDB Conditional JoinsRethinkDB 条件连接
【发布时间】:2014-06-07 13:30:22
【问题描述】:

我有一个这样的结构,用于“会话”:

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

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

【问题讨论】:

    标签: node.js rethinkdb


    【解决方案1】:

    输出与 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
            }
    })
    

    【讨论】:

    • 不完全是,“reservation”属性中的数据不仅仅是用户本身。付款状态、预订时间等
    • 整个会话在字段session中返回。因此,您可以使用 doc["session"]["reservation"]["status"] 等访问付款状态。
    • 无论如何,最终还是基于这个概念得到了一些东西,看起来它会很好用!谢谢@neumino!由于我们没有使用实际的连接,因此我确信性能会受到影响,但我认为这是一个公平的权衡。
    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多