在 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")])
,它应该可以工作。
我正在 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")])
,它应该可以工作。