RethinkDb эквивалент для фильтра между датами - PullRequest
0 голосов
/ 14 ноября 2018

Я действительно новичок в ReThinkDB из MySQL, и у меня есть некоторые задачи, использующие ReThinkDB.

Теперь я хотел бы реализовать что-то вроде ...

MySQL:

select * 
from reservations
where 
    room_id = '7cc8e51d-e3fa-4d84-b7e6-9ebf8975754a' and
    ((reservation_start between `11-01-2018 00:00:00` and `11-30-2018 23:59:59`) OR
    (reservation_end between `11-01-2018 00:00:00` and `11-30-2018 23:59:59`))

ReThinkDB:

Это эквивалентный запрос с использованием filter(), благодаря @Peter:

r.db("myDb").table("reservations").filter(function(doc){ 
    return 
        doc("room_id").eq("7cc8e51d-e3fa-4d84-b7e6-9ebf8975754a")
            .and(doc("reservation_start").gt("2018-12-01T00:00:00").and(doc("reservation_start").lt("2018-12-10T23:59:59"))
                .or(doc("reservation_end").gt("2018-12-01T00:00:00").and(doc("reservation_end").lt("2018-12-10T23:59:59"))))
    }
)

Но я не уверен, как преобразовать две проверки диапазона дат в кратные.

Спасибо!

Ответы [ 2 ]

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

Теперь я немного лучше понимаю вашу проблему

Сначала преобразуйте ваш запрос в java:

r.db("myDb").table("reservations").filter(doc ->
    doc.g("room_id").eq("7cc8e51d-e3fa-4d84-b7e6-9ebf8975754a")
      .and(doc.g("reservation_start").gt("2018-12-01T00:00:00").and(doc.g("reservation_start").lt("2018-12-10T23:59:59"))
      .or(doc.g("reservation_end").gt("2018-12-01T00:00:00").and(doc.g("reservation_end").lt("2018-12-10T23:59:59")))))

Теперь оптимально. Возможно, вы захотите использовать room_id в качестве вторичного индекса:

r.db ("myDB"). Table ("резервирование"). IndexCreate ("room_id")

И тогда вы можете использовать в своем запросе как:

 r.db("myDb").table("reservations")
    .getAll("7cc8e51d-e3fa-4d84-b7e6-9ebf8975754a")
    .optArg("index","room_id")
    .filter(...)

"Но я не уверен, как преобразовать две проверки диапазона дат в кратные между собой."

1.) Создать индекс составного массива

r.db("myDb").table("reservations").indexCreate(
    "reservation_date", [r.row("reservation_start"), r.row("reservation_end")]

2.) используйте запрос между

r.db("myDb").table("reservations").between(
    ["2018-12-01T00:00:00", "2018-12-01T00:00:00"], ["2018-12-10T23:59:59", "2018-12-10T23:59:59"], {index: "reservation_date"}
)    

// примечание: теперь это становится сложным, когда вам также нужен идентификатор комнаты:)

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

В зависимости от того, в каком формате вы храните даты:

Вариант 1:

r.db("myDB").table("reservations").filter(function (doc) {
    return doc("reservation_date").during(
        r.time(2018, 11, 10, 'Z'), r.time(2018, 11, 20, 'Z'));
})

вариант 2:

 r.db("myDB").table("reservations").filter(function(doc){ 
  return doc("reservation_date").gt("2018-11-10T18:15:31.000000Z")
    .and(doc("reservation_date").lt("2018-11-20T18:15:31.000000Z"))})

Альтернативный способ повышения производительности:

создать индекс на дату бронирования:

  r.db("myDB").table("reservations").indexCreate("reservation_date")

, затем используйте следующий запрос:

  r.db("myDB").table('reservations')
    .between("2018-11-10T18:15:31.000000Z",
             "2018-11-20T18:15:31.000000Z", {index: "reservation_date"})
...