在RethinkDB(javascript)中创建二级索引不像在文档

时间:2015-12-08 20:33:44

标签: rethinkdb rethinkdb-javascript

我正在基于RethinkDB中的2个字段创建一个索引,在javascript中(实际上是rethinkdbdash驱动程序)。代码是这样的: r.table('someTable').indexList().contains("indexName").do(containsIndex => { return r.branch( containsIndex, {created: 0}, r.table('someTable').indexCreate("indexName", [r.row("field1"), r.row("field2")]) ); }).run();

因此,如果索引已经存在,它会有条件地创建索引。分支确实适用于单字段索引。但在这种情况下,它会返回ReqlCompileError: Cannot use r.row in nested queries. Use functions instead

文档(https://www.rethinkdb.com/api/javascript/index_create/)清楚地给出了这个例子: r.table('comments').indexCreate('postAndDate', [r.row("postId"), r.row("date")]).run(conn, callback)

那我错过了什么?使用rethinkdbdash驱动程序改变什么?如果我确实使用了一个函数(如错误消息所示),我可以连接我的2个字段,但是如何查询该索引?

感谢。

2 个答案:

答案 0 :(得分:2)

您可以在非嵌套查询中使用r.row,例如文档中的示例,但对于嵌套查询,您需要使用实际函数。当您将indexCreate放在do内时,它就会成为嵌套查询的一部分。

如果您在查询中编写r.table('someTable').indexCreate("indexName", [r.row("field1"), r.row("field2")])而不是r.table('someTable').indexCreate('indexName', function(row) { return [row('field1'), row('field2')]; }),那么它应该有用。

答案 1 :(得分:1)

我不知道如何在创建复合索引时正确地执行此类分支,但如果您尝试创建已存在的索引,RethinkDB会警告您,所以如果您只是抓住它就不用担心并继续:

function createPostAndDateIndex() {
  return r.table('comments').indexCreate('postAndDate', 
    [r.row("postId"), r.row("date")]).run();
}

function createDateIndex() {
  return r.table('comments').indexCreate('d', 'date').run() 
}

function initDb() {
  return createPostAndDateIndex().error(console.warn)
    .then(createDateIndex).error(console.warn);
}