2016-10-16 2 views
0

우리는 매우 큰 숫자의 MongoDB 문서 모음을 가지고 있습니다. 일부 미리 정의 된 필드는 값을 가질 수도 있고 그렇지 않을 수도 있습니다.MongoDB - 가능한 한 빨리 채우기 속도를 얻는 방법?

해당 필드를 fill-rates 개 수집해야하며, 모든 문서를 검토하고 각 문서의 채우기 비율을 계산하는 스크립트를 작성했습니다. 모든 문서를 처리하는 데 시간이 오래 걸립니다.

db.collection.aggregate 또는 db.collection.mapReduce과 같은 스크립트 서버 측을 실행하는 방법이 있습니까? 성능이 크게 개선되어야합니까? 해당 컬렉션의 다른 용도 (예 : 주요 잠금 장치)가 느려 집니까?

답변

1

내 질문에 답하면 커서를 사용하여 커서를 사용하여 전체 콜렉션을 검색하고 맵 축소 쿼리로 스크립트를 마이그레이션 할 수 있었고 콜렉션 샘플에서 실행하면 최소한 두 배 빠른 map-reduce.

var cursor = collection.find(query, projection).sort({_id: 1}).limit(limit); 
var next = function() { 
    cursor.nextObject(function(err, doc) { 
     processDoc(doc, next); 
    }); 
}; 
next(); 

을이 새로운 스크립트입니다 : 여기

이전 스크립트 (Node.js를에서) 근무 방법

collection.mapReduce(
    function() { 
     var processDoc = function(doc) { 
      ... 
     }; 
     processDoc(this); 
    }, 
    function (key, values) { 
     return Array.sum(values) 
    }, 
    { 
     query : query, 
     out: {inline: 1} 
    }, 
    function (error, results) { 
     // print results 
    } 
); 

processDoc는 기본적으로 동일한 체재, 대신 카운터를 증가의 전역 통계 개체에서 나는 다음을 수행합니다.

차 100K의 샘플에 새로운 오래된 새로운 8.

몇 가지 메모를했다, 20 초에 나섭니다 :

  1. limit 옵션은 분산됩니다 컬렉션에서 작동하지 않습니다지도-감소, 나는 질의했다 _id : { $gte, $lte}을 사용하여 필요한 샘플 크기를 만드십시오.
  2. map-reduce의 성능 향상 옵션 : jsMode : true은 샤드 드 컬렉션에서도 작동하지 않으며 (성능을 더 향상시킬 수 있음) 각 샤드에서 수동으로 실행하여 해당 기능을 얻을 수 있습니다.
+0

그래도 질문이 명확하지 않다면, 집계가 MapReduce보다 빠르다는 말을하지 않은 것입니다. 어쨌든 잘 했어! –

+0

문서를 하나씩 집계 함수로 처리하는 일반 node.js 스크립트에서 일반적인 마이그레이션 방법을 찾을 수 없기 때문에 실제로 알지 못합니다. 위의 솔루션은 어떻게 map- 줄이다 – marmor

1

나는 당신이 달성하고자하는 것이 당신의 문서에서 계산되고, 그 후에 당신은 질의 될 수있는 새로운 "문서"를 가지고 있다는 것을 이해했다. 계산 된 "새 값"을 저장할 필요가 없습니다.

해당 문서 내에 "새 값"을 쓸 필요가없는 경우 집계 프레임 워크를 사용할 수 있습니다.

집계 연산은 데이터 레코드를 처리하고 계산 된 결과를 반환합니다. 집계 연산은 여러 문서의 값을 함께 그룹화하고 그룹화 된 데이터에서 다양한 작업을 수행하여 단일 결과를 반환 할 수 있습니다.

https://docs.mongodb.com/manual/aggregation/

집계 프레임 워크 기능을 많이 가지고 있기 때문에 내가 당신에게 당신의 문제를 해결하는 방법에 대한 자세한 정보를 제공 할 수 없습니다.

+0

덕분에지도 작성 기술뿐만 아니라 집계 프레임 워크에 대해서도 알고 있었기 때문에 제 질문은 필드 채움 비율을 계산하는 데 사용 된 질문 중 하나였습니다.또한 성능 개선/문제점에 대한 내 관련 질문에 대한 답변을 제공하지 않습니다. – marmor

+0

귀하가 수집 한 데이터로 질문을 업데이트하십시오. –

+0

덕분에 map-reduce를 사용하여 스크립트를 다시 작성하는 데 성공했습니다. 내 대답은 아래를 참조하십시오. – marmor

관련 문제