RethinkDb запрашивает текущую дату и время между двумя столбцами даты - PullRequest
0 голосов
/ 16 ноября 2018

Извините, если это действительно простой вопрос / вопрос noob, но я действительно новичок в переосмыслении DB, пришедшего из SQL.

(1)

Ниже приведен запрос в SQL, который я хотел преобразовать в ReThinkDb. Это может быть очень просто, но я не могу сделать это правильно.

SQL-эквивалент:

select *  
from reservations
where
    room_id = 'b1a7ddd3-ddfd-4624-8e85-79b47fb19f99' and  
    now() between reservation_start and reservation_end

Запрос RethinkDb (с ошибкой):

r.db("myDb").table("reservations").filter(function(doc){ 
    return 
        doc("room_id").eq("b1a7ddd3-ddfd-4624-8e85-79b47fb19f99")
            .and( r.now().between(doc("reservation_start ").date(), doc("reservation_end").date()) )
    }
)

Я просто хочу вернуть бронирование, запланированное на сегодняшний день или продолжающееся, если оно уже началось, но еще не завершено (дата и время окончания).

(2)

Бронирование имеет столбец или поле для посетителей, которое представляет собой список / массив имени / адреса электронной почты:

attendees: [
  {"name": "Attendee 1", "email": "attendee1@test.com"},
  {"name": "Attendee 2", "email": "attendee2@test.com"},
  {"name": "Attendee 3", "email": "attendee3@test.com"},
]

Я бы хотел добавить фильтр, чтобы проверить, существует ли email в list of attendees.

Это похоже на запрос: у электронной почты attendee2@test.com сегодня есть заказ на room 101.

Если запрос с электронной почтой не представляется возможным или сложным ... Я не возражаю, так как я могу выполнить проверку в моем приложении. Имеет значение эквивалент запроса rethinkdb для now() between dateColumnStart and dateColumnEnd.

Обновление: добавлены примеры данных, хранящихся в БД (RethinkDB)

{
"attendees": [
    {
        "email": dummyUser101@gmail.com, »
        "name":  "Dummy User 101"
    } ,
    {
        "email": dummyUser102@gmail.com, »
        "name":  "Dummy User 102"
    }
] ,
"id":  "45qum29cel0cm4ejl2obi6pttj" ,
"room_id":  "7cc8e51d-e3fa-4d84-b7e6-9ebf8975754a" ,
"reservation_end":  "2018-11-23T02:00:00" , //10AM (GMT8)
"reservation_start":  "2018-11-19T00:00:00" , //8AM (GMT8)
"details":  "Week event 8AM-10AM Test"
}

{
"attendees": [
    {
        "email": dummyUser103@gmail.com, »
        "name":  "Dummy User 103"
    } ,
    {
        "email": dummyUser101@gmail.com, »
        "name":  "Dummy User 101"
    } ,
    {
        "email": dummyUser102@gmail.com, »
        "name":  "Dummy User 102"
    }
] ,
"id":  "6ejq8h6tvlpnjiskvt4kthfmss_20181123T060000Z" ,
"room_id":  "7cc8e51d-e3fa-4d84-b7e6-9ebf8975754a" ,
"reservation_end":  "2018-11-23T07:00:00" , //3PM (GMT8)
"reservation_start":  "2018-11-23T06:00:00" , //2PM (GMT8)
"details":  "Test Reservation"
}

Спасибо!

1 Ответ

0 голосов
/ 16 ноября 2018

(1)

Нельзя использовать между ними в фильтре.Между вами попадает все документы между двумя ключами.См. Документ здесь: https://www.rethinkdb.com/api/javascript/between/

Вам нужно ключевое слово "while".

r.db("myDB").table("reservations").filter(function(doc){ 
    return doc("room_id").eq("b1a7ddd3-ddfd-4624-8e85-79b47fb19f99")
        .and( r.now().during(
           r.ISO8601(doc("reservation_start"),{defaultTimezone:"+08:00"}),
           r.ISO8601(doc("reservation_end"),{defaultTimezone:"+08:00"})))
    }
)  
...