1

我正在基于 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在这种情况下它返回 a 。

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

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

谢谢。

4

2 回答 2

2

您可以r.row在文档中的示例等非嵌套查询中使用,但对于嵌套查询,您需要使用实际函数。当你把indexCreatea 放在里面时,do它就变成了嵌套查询的一部分。

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

于 2015-12-08T23:22:31.620 回答
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);
}
于 2015-12-08T22:23:21.017 回答