2013-04-08 124 views
2

我有一个集合'匹配'内有727000个文档。它里面有6个字段,没有数组只是简单的整数和对象ID。我正在查询收集如下:Mongodb toArray()性能

matches.find({ 
    $or: [{ 
     homeTeamId: getObjectId(teamId) 
    }, { 
     awayTeamId: getObjectId(teamId) 
    } 
    ], 
    season: season, 
    seasonDate: { 
    '$gt': dayMin, 
    '$lt': dayMax 
    } 
}).sort({ 
    seasonDate: 1 
}).toArray(function (e, res) { 
    callback(res); 
}); 

结果只返回大约7-8个文件。 查询需要约100ms,我认为这是相当合理的,但主要问题是,当我调用方法toArray()时,它增加了约〜600ms! 我正在我的笔记本电脑上运行服务器,Intel Core I5,6GB RAM,但我无法相信它会为7-8文档添加600ms。 尝试使用mongodb本机驱动程序,现在切换到mongoskin,并获得同样缓慢的结果。 有什么建议吗?

+0

是什么'回调()'做什么? – bdesham 2013-04-08 21:28:16

+0

它从函数返回数据。我在函数exports.getPrevNextMatches = function(teamId,callback){}中封装了这个查询。但是当我做同样没有toArray()方法时,要返回结果的游标,它需要提到〜100毫秒。 toArray()方法增加〜600ms – Dove 2013-04-08 21:31:34

+1

你是否在'find'结果而不是'toArray'上尝试'forEach'?我怀疑这会有所帮助,但这是一件容易的事情。另外,'explain'给你的查询是什么? – WiredPrairie 2013-04-09 00:32:25

回答

2

toArray()方法迭代抛出所有游标元素并将它们加载到内存中,这是一个非常昂贵的操作。也许你可以添加索引来提高你的查询性能,并且/或者避免toArray迭代你自己抛出Cursor。

问候, Moacy