わかりました、私はあなたが何を意味するか知っていると思います。次のような構造を作成しました。
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 側から、上記のスクリプトを評価してから、次のことを行います。
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 キャッシュのクリアのようなことをするのではないでしょうか? 問題はバルクサイズに依存しません (10、100、1000、10000 でテストされ、常に同じ結果が得られます)。