我正在根据RethinkDB中的两个字段(实际上是rethinkdbdash驱动程序)在javascript中创建一个索引。代码如下所示: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。
docs (create/)清楚地给出了这个例子:r.table('comments').indexCreate('postAndDate', [r.row("postId"), r.row("date")]).run(conn, callback)
那我错过了什么?使用rethinkdbdash t驱动程序正在改变什么吗?如果我确实使用了一个函数(正如错误消息所建议的那样),我可以连接我的两个字段,但是如何使用该索引进行查询呢?
谢谢。
发布于 2015-12-08 23:22:31
可以在非嵌套查询(如文档中的示例)中使用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')]; }),那么它应该可以工作。
发布于 2015-12-08 22:23:21
在创建复合索引时,我不知道如何正确地进行这种分支,但是如果您试图创建一个已经存在的索引,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);
}https://stackoverflow.com/questions/34165489
复制相似问题