1

我正在尝试有效地检索以下格式的数据:

{
  "datetime": "1453845345493",
  "someIds": ["id2000-4", "id1000-34", "id2000-43", "id250-34"]
}

具体来说,我想做的是“查找自给定时间以来发生的所有记录,并在其中返回任何具有一个或多个 Id 列表的记录”。

到目前为止,我按照此处显示的方法使用以下方法创建复合多索引:

r.db("dbName").table("tableName")
  .indexCreate(
    "idDatetime", 
    function(each) {
      return each("someIds").map(function(id){
        return [each("datetime"), id]
      })
    }
    ,{multi: true})

这成功地根据看起来像的值构建了一个索引["1453845345493", "id2000-4"]

但是现在感觉我有点太深了,实际上不知道如何使用该索引进行查询来完成上述目标。您如何制作该查询?

4

2 回答 2

1

我认为(我可能错了),基本上,我们有两种类型的索引查找:

  • 完全匹配:get,getAll
  • 范围匹配:between

所以在你的情况下,很明显我们不能使用getAll,因为你想要find all records that have happened since a given time, and of those, return any that have one or more of a list of Id

那只剩下我们了between。所以让我们找到一种方法来建模它。

我建议将datetime字段更改为数字而不是字符串。我猜你正在存储时代。

我们将像您一样创建索引:

r.table('t11').indexCreate('idDatetime', function(doc) {
  return doc('someIds').map(function(id){
        return [doc("datetime"), id]
  })
}, {multi: true})

然后我们像这样查询它:

r.table('t11')
 .between([1453845345493, "id1000-34"], [r.maxval, "id1000-34"], {index: 'idDatetime'})

查找自该纪元以来的所有文档并包含id1000-34. 您可以使用 JavaScript 或 RethinkDB 日期时间函数找到昨天的纪元。


更新:

虽然它并不完美,但我们可以像这样模拟任何一个 id:

r.expr(["id1000-34", "id1000-4"])
  .concatMap(function(needle) {
    return r.table('t11')
     .between([1453845345499, needle], [r.maxval, needle], {index: 'idDatetime'})
  })
  .distinct()
于 2016-01-27T23:02:43.923 回答
0

如果你还没有,你绝对应该在我们的文档中查看这个关于多索引的页面。

使用您显示的数据的示例如下所示:

r.table("tableName").getAll("id2000-4", {index: "idDatetime"}).run(conn, callback)

这应该会为您提供该表中包含id2000-4该数组的所有文档。

让我知道这是否适合您!

于 2016-01-27T18:06:51.680 回答