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
})
);
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
变量处理该行的任何行为。
使用 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
})
);
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
变量处理该行的任何行为。