RethinkDB:​​判断结果集中是否有下一个文档

RethinkDB: Determine if there is a next document in result set

使用 RethinkDB JavaScript 驱动程序,有没有办法确定在 "cursor.each" 或 "cursor.on('data')" 事件中是否有另一个文档可用?

通过each

cursor.each(function(err, doc) {
        if (err) throw err;

        // process document here
        // Is there a way to tell if there is another doc coming?

    }, function() {
        // End of data here, no document passed
    })
);

或通过Event Emitter

cursor.on('data', function(doc) { 
    // handle doc, check if another doc is coming or not
});
cursor.on('end', function() { 
    // no document passed, just indicating end of data
})

each游标方法的真正意思是独立处理元素。如果您需要做一些更复杂的事情,我建议您使用 next (http://rethinkdb.com/api/javascript/next/)——有关如何使用该方法的详细信息,请参阅示例。

如果您的数据集很短,您也可以调用 cursor.toArray() 并只获取元素数组。

有几种方法可以解决这个问题。请记住,这些仅在您当前不在 changefeed.

时才有效

1.使用 cursor.toArray()

你可以先把游标转换成数组,然后直接用索引判断游标上是否还有一行。

r 
  .table('hello')
  .filter({ name: 'jorge' })
  .run(conn)
  .then(function (cursor) {
    return cursor.toArray();
  })
  .then(function (array) {
     array.forEach(function (row, i) {
        if (i === array.length - 1) {
           // There are now more rows after this
        } else {
           // There are more rows
        }
     }); 
  });

正如上面提到的 coffeemug,这种方法不适用于大型数据集,因为将游标转换为数组意味着您必须加载所有数据。

2。使用 cursor.next

一种不太方便但性能更高的方法是使用 cursor.next。这样做的方式是,如果游标中没有更多行,游标上的 .next 方法将抛出错误。

您的代码将如下所示:

r
  .table('hello')
  .filter({ name: 'jorge' })
  .run(conn)
  .then(function (cursor) {
    var hasNextRow = function (cb, prevRow) {
      cursor.next(function (err, row) {
        if (err) cb(false, prevRow);
        if (row) cb(true, prevRow, row);
      })
    };
    var consoleRow = function (row) {
      hasNextRow(function (hasNextRow, prevRow, row) {
        if (prevRow) {
          if (!hasNextRow) console.log('isLast');
          // This is your row
          console.log(i, prevRow);
        }
        if (hasNextRow) {
          consoleRow(row);
        }
      }, row);
    };
    consoleRow();
  });

基本上,此代码保存对最后一行的引用并继续到下一行。届时,它会知道下一行是否存在,您可以使用 prevRow 变量处理该行的任何行为。