在RethinkDB中查询复合多索引

时间:2016-01-27 15:59:05

标签: rethinkdb rethinkdb-javascript

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

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

具体来说,我想要做的是"查找自给定时间以来发生的所有记录,以及那些记录中包含一个或多个ID列表的记录。"

到目前为止,我按照shown here方法使用以下方法创建了一个复合多索引:

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

这可以基于看起来像["1453845345493", "id2000-4"]

的值成功构建索引

但是现在感觉我有点太深了,并且实际上并不知道如何使用这个索引来实现上述目标。你是如何制作这个查询的?

2 个答案:

答案 0 :(得分:1)

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

  • 完全匹配:getgetAll
  • 范围匹配: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()

答案 1 :(得分:0)

如果你没有在我们的文档中明确check out this page on multi-indexes

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

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

这应该可以获得该表中该数组中id2000-4的所有文档。

让我知道这是否适合你!