RethinkDb等效于日期之间的过滤器

时间:2018-11-14 10:20:03

标签: mysql rethinkdb

我真的是MySQL的ReThinkDB的新手,我有一些使用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 :(得分:1)

取决于您存储日期的格式:

选项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"})

答案 1 :(得分:0)

现在,我对您的问题有了更好的了解

首先将查询转换为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"}
)    

//注意:现在,当您还需要房间ID时,这将变得很棘手:)