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

Creating secondary indexes in RethinkDB (javascript) not working as in doc

我正在 javascript 中基于 RethinkDB 中的 2 个字段创建索引(实际上使用 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();

因此,如果索引尚不存在,它会根据条件创建索引。分支确实适用于单字段索引。但在这种情况下 returns 是 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 个字段,但是我该如何查询该索引?

谢谢。

我不知道在创建复合索引时如何正确地进行这种类型的分支,但是如果您尝试创建一个已经存在的索引,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);
}

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

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