내 질문에 답하면 커서를 사용하여 커서를 사용하여 전체 콜렉션을 검색하고 맵 축소 쿼리로 스크립트를 마이그레이션 할 수 있었고 콜렉션 샘플에서 실행하면 최소한 두 배 빠른 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 초에 나섭니다 :
- 의
limit
옵션은 분산됩니다 컬렉션에서 작동하지 않습니다지도-감소, 나는 질의했다 _id : { $gte, $lte}
을 사용하여 필요한 샘플 크기를 만드십시오.
- map-reduce의 성능 향상 옵션 :
jsMode : true
은 샤드 드 컬렉션에서도 작동하지 않으며 (성능을 더 향상시킬 수 있음) 각 샤드에서 수동으로 실행하여 해당 기능을 얻을 수 있습니다.
그래도 질문이 명확하지 않다면, 집계가 MapReduce보다 빠르다는 말을하지 않은 것입니다. 어쨌든 잘 했어! –
문서를 하나씩 집계 함수로 처리하는 일반 node.js 스크립트에서 일반적인 마이그레이션 방법을 찾을 수 없기 때문에 실제로 알지 못합니다. 위의 솔루션은 어떻게 map- 줄이다 – marmor