2013-04-08 80 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