我正在对一个光标的每个元素执行一个进程,我的集合有大约600万个文档,整个过程需要长达10个小时,因为我必须一次处理一个配置文件,这是一个有点复杂的过程每一个。
var cursor = dbMain.collection("profiles").find({});
var getNext = function(){
cursor.nextObject(processOne);
};
var processOne = function(err, profile){
if(err){
console.error("Error loading profile", err);
getNext();
} else if(profile == null){
// process is done, all profiles processed!!!
} else {
processProfile(profile)
.then(function(){
getNext();
})
.catch(function(errProfile){
console.error("Error processing profile", errProfile);
getNext();
});
}
};
var processProfile = function(profile){
// Complex profile processing and promise resolve when done
};
getNext();
问题:当我大约有300,000个配置文件时,我得到null(这意味着光标已经耗尽),因此,只有前300,000个左右被处理。 ¿任何人都知道如何处理它或者我之前得到空路的原因?
答案 0 :(得分:3)
我似乎找到了原因:
由于它是一个需要长时间存活的游标,因此在查找选项中我必须添加" timeout:false"。
var cursor = dbMain.collection("profiles").find({}, {timeout : false});
driver documentation默认情况下说它是假的(好吧不是!!),现在我的所有个人资料都被处理了。
答案 1 :(得分:2)
对于在最新的MongoDB驱动程序上偶然发现此驱动程序的任何人,请注意以下几点。如果您在上次.hasNext()
通话之后两次致电.next()
,则会得到:Error: Cursor is closed
。
例如:
while(await cursor.hasNext()) {
await cursor.next();
}
if (await cursor.hasNext()) {} // Error!
if (!cursor.isClosed() && await cursor.hasNext()) {} // Correct way
答案 2 :(得分:0)
我遇到了同样的问题,我通过将光标的每个文档推送到列表上然后返回列表来解决它,如下所示:
const list:any= [];
const cursor= await client.db('insertYourDb').collection('insertYourCollection').find().forEach(function(document) {
list.push(document)
});
return list;