好吧,我想我知道,你的意思。我创建了一个如下结构:
var bulksize = 1000;
var col = db.getCollection("..");
var queryRes = col.find( { ... } )
process = function(entity) { ... }
nextEntries = function()
{
var res = new Array();
for(var i=0; i<bulksize; i++)
{
if(hasNext())
res.push(process(queryRes.next()));
else
break;
}
return res;
}
hasNext = function()
{
return queryRes.hasNext();
}
该脚本将结果分成 1000 个条目。从 Python 端 eval 注意到脚本,然后我执行以下操作:
while database.eval('hasNext()'):
print "test"
for res in database.eval('return nextEntries()'):
doSth(res)
有趣的是,控制台总是说:
test
test
test
test
test
test
然后我得到错误:
pymongo.errors.OperationFailure: command SON([('$eval', Code('return nextEntries()', {})), ('args', ())]) failed: invoke failed: JS Error: ReferenceError: nextEntries is not defined nofile_a:0
这意味着,第一次调用 nextEntries() 有效,但随后该函数不再存在。会不会是 MongoDB 做了一些类似于清除 JavaScript 缓存的事情?问题不取决于bulksize(使用10、100、1000、10000 进行测试,结果始终相同)。