我将async.queue
和Cursor.nextObject
结合起来,在游标上迭代并对返回的文档执行一些异步工作。
有一个很棒的小程序包已经做到了这一点,https://www.npmjs.org/package/mongo-cursor-processing,但不幸的是它没有公开底层队列,这是我需要的。
所以,我试着自己实现它,但遇到了一个障碍。有时,Cursor.nextObject
返回null
而实际上有更多的文档。
下面是我附加到队列的一个小代码片段,以说明:
if (this.cursor && this.length() < this.concurrency) {
this.cursor.nextObject(function(err, item) {
console.log(this.name + ': ' + (item ? item._id : '<null>') + ' ' + (err ? err : '<null>'));
if (item) {
this.push(item);
} else {
// delete this.cursor;
}
}.bind(this));
}
控制台日志显示:
... Maybe 100 lines ...
prop-queue: 511abbd59c0d972a3e000119 <none>
prop-queue: 511abbd59c0d972a3e00011d <none>
prop-queue: 511abbd59c0d972a3e000120 <none>
prop-queue: 511abbd59c0d972a3e000122 <none>
prop-queue: <none> <none>
prop-queue: 511abbd59c0d972a3e000125 <none>
prop-queue: 511abbd59c0d972a3e000127 <none>
prop-queue: 511abbd59c0d972a3e000129 <none>
prop-queue: 511abbd59c0d972a3e00012c <none>
... 1000's more lines before the next null ...
有时,在下一次调用成功之前,
<none> <none>
行会重复两次。真正有趣的部分是,当我在mongo shell中执行查询时,在
511abbd59c0d972a3e000122
和511abbd59c0d972a3e000125
被打印到控制台之间会有一个停顿。暂停时间大约为0.75秒,正好是空文档在光标中的位置。我在查询中遍历了数千个文档,这是我唯一经历的暂停。此外,检查空值两边的两个文档没有显示任何特性。有什么可能导致这两种可能相关的现象吗?
最佳答案
我仍然不确定是什么导致了暂停,但似乎是罪魁祸首。
在暂停期间,Cursor.nextObject
在第一次返回之前被调用多次。其中一些呼叫正在返回null
。解决方案是确保从不同时调用Cursor.nextObject
。
if (this.cursor && !this.cursor_exec && this.length() < this.concurrency) {
this.cursor_exec = true;
this.cursor.nextObject(function(err, item) {
console.log(this.name + ': ' + (item ? item._id : null) + ' ' + (err ? err : null));
this.cursor_exec = false;
if (item) {
this.push(item);
} else {
delete this.cursor;
}
}.bind(this));
}
关于node.js - Mongo的Cursor.nextObject有时会错误地返回Null?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25155180/