RethinkDB - coerceTo(“array”)vs游标性能?

时间:2016-10-10 00:24:28

标签: cursor rethinkdb

考虑一个查询,我知道它将返回不超过一个结果。如果不是这样,是否有任何性能损失:

r.table('users').filter({facebookUserId:facebookUserId}).
    run(connection, function(err, cursor) {
        if (err) throw err;
        cursor.toArray(function(err, result) {
            if (err) throw err;
            //return the value
        });
    });

我用这个:

const res = await r.table('users')
            .filter({facebookUserId:facebookUserId})
            .coerceTo("array")
            .run(connection);

我特指的是coerceTo()命令与游标的对比。

1 个答案:

答案 0 :(得分:3)

我会做以下事情:

  • facebookUserId上创建一个索引,以便我可以使用r.table('users').getAll(myInput, {index: 'facebookUserId'}),避免解析所有文档(更快地等待)
  • 致电sequence.coerceTo(),因为它是可能分布式,可扩展的数据库中的又一步
  • 使用cursor.next(),因为它一旦准备就直接提供下一个元素,而不是cursor.toArray(),在这种情况下,它将执行相同的 plus 检查流已结束(因此必须更慢)
  • 在我cursor.close()直接释放资源后立即致电cursor.next()
  • 调整我的代码,以便我甚至不需要访问数组的第一个元素,因为cursor.next()没有无用地将我的文档封装在数组中

最后: r.table('users').getAll(facebookUserId, {index: 'facebookUserId'}) .run(connection, function(err, cursor) { if (err) throw err; cursor.next(function(err, item) { cursor.close() if (err) throw err; //do something with item instead of result[0]; }); }); 还有一件事:cursor.next()行为可以使用cursor.each()return false完成。但是,如果方法的性能不同(我不知道但a documentation note倾向于each),我们仍然需要在关闭光标之前等待cursor.each()的返回,这不是'39}所有事情都考虑到了最好的表现形象。

希望这有帮助!