Условные соединения 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")
)

Однако этот запрос будет получать ТОЛЬКО сеансы, которые в настоящее время имеют резервирование. Я хотел бы получить все сеансы, а также выполнить соединение для тех сеансов, для которых есть резервирование. Есть ли способ сделать это с помощью одного запроса, или мне просто нужно выполнить второй запрос после первого, чтобы захватить сеансы без оговорок? Нужно ли моделировать данные по-другому?


person Seventoes    schedule 22.04.2014    source источник


Ответы (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
        }
})
person neumino    schedule 22.04.2014
comment
Не совсем, атрибут резервирования содержит больше данных, чем просто сам пользователь. Статус платежа, время бронирования и т.д. - person Seventoes; 23.04.2014
comment
Весь сеанс возвращается в поле session. Таким образом, вы можете получить доступ к статусу платежа с помощью doc[session][reservation][status] и т. д. - person neumino; 23.04.2014
comment
В конце концов, в конце концов, получилось что-то, основанное на этой концепции, похоже, это будет отлично работать! Спасибо @neumino! Я уверен, что это удар по производительности, поскольку мы не используем фактическое соединение, но я думаю, что это справедливый компромисс. - person Seventoes; 12.05.2014