我正在尝试有效地检索以下格式的数据:
{
"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"]
但是现在感觉我有点太深了,并且实际上并不知道如何使用这个索引来实现上述目标。你是如何制作这个查询的?
答案 0 :(得分: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()
答案 1 :(得分:0)
如果你没有在我们的文档中明确check out this page on multi-indexes。
使用您显示的数据的示例如下:
r.table("tableName").getAll("id2000-4", {index: "idDatetime"}).run(conn, callback)
这应该可以获得该表中该数组中id2000-4
的所有文档。
让我知道这是否适合你!