2013-04-08 4 views
2

안에 727000 개의 문서가있는 'matches'컬렉션이 있습니다. 내부에는 6 개의 필드가 있으며, 배열에는 단순한 정수와 객체 ID가 없습니다. 다음과 같이 컬렉션에 대한 쿼리를 수행하고 있습니다.Mongodb toArray() performance

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-native 드라이버를 사용해 보았습니다. 이제는 mongoskin으로 바뀌었고, 같은 느린 결과를 얻었습니다. 제안 사항이 있으십니까?

+0

'콜백()'은 무엇입니까? – bdesham

+0

함수에서 데이터를 반환합니다. exports.getPrevNextMatches = function (teamId, callback) {} 내에서이 쿼리를 래핑했습니다. 그러나 toArray() 메서드를 사용하지 않고 동일한 결과를 얻으려면 ~ 100ms를 사용합니다. toArray() 메소드가 ~ 600ms를 더함 – Dove

+1

'forEach'를'toArray' 대신'find' 결과에 시도 했습니까? 나는 그것이 도움이 될지는 모르지만, 시도하는 것은 쉬운 일이다. 또한,'explain'이 그 쿼리를 알려줍니다. – WiredPrairie

답변

2

toArray() 메서드는 모든 커서 요소를 throw하고 메모리에로드하므로 매우 비용이 많이 드는 작업입니다. 어쩌면 인덱스를 추가하여 쿼리 성능을 향상시키고, toArray가 반복적으로 커서를 던지지 않도록 할 수 있습니다.

감사합니다, Moacy