0

我正在尝试通过 Python 从 MongoDB 查询大量结果。我通过 JavaScript 执行此操作,因为我想在树状结构中获得类似孙辈的东西。我的代码如下所示:

col = db.getCollection(...)
var res = new Array();
col.find( { "type" : ["example"] } ).forEach(
  function(entry) 
  {
    v1 = col.find( {"_id" : entry["..."]} )
    ... (walk through the structure) ...
    vn = ...
    res.push([v1["_id"], vn["data"]]);
  } 
);         
return res;

现在,我遇到了问题,结果数组变得非常(太大)并且超出了内存。有没有办法产生结果而不是将它们推入数组?

4

2 回答 2

0

好吧,我在MongoDB的源代码中找到了一行,它清除了所有使用超过10次的JavaScript。因此,如果不希望在数据库服务器上进行任何更改,则需要多次查询数据库并借助 skip() 和 limit() 函数通过选择项目数量来向客户端发送批量。这工作得非常快。谢谢你的帮助。

于 2013-03-06T13:09:22.020 回答
0

好吧,我想我知道,你的意思。我创建了一个如下结构:

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 进行测试,结果始终相同)。

于 2013-03-04T12:44:04.400 回答