我正在基于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个字段,但是如何查询该索引?
感谢。
答案 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);
}