복붙노트

[MONGODB] MongoDB를 - 모음의 모든 레코드를 업데이트하는 가장 빠른 방법은 무엇입니까?

MONGODB

MongoDB를 - 모음의 모든 레코드를 업데이트하는 가장 빠른 방법은 무엇입니까?

나는 900 만 개 기록으로 된 컬렉션이 있습니다. 저는 현재 전체 컬렉션을 업데이트하려면 다음 스크립트를 사용하고 있습니다 :

simple_update.js

db.mydata.find().forEach(function(data) {
  db.mydata.update({_id:data._id},{$set:{pid:(2571 - data.Y + (data.X * 2572))}});
});

이것은 다음과 같이 명령 줄에서 실행됩니다 :

mongo my_test simple_update.js

모든 그래서 나는 간단한 계산에 따라 PID 새로운 필드를 추가하고있는 중이 야.

더 빠른 방법이 있나요? 이것은 상당한 시간이 소요됩니다.

해결법

  1. ==============================

    1.당신이 할 수있는 두 가지가 있습니다.

    당신이 할 수있는 두 가지가 있습니다.

    그 링크는 또한 다음과 같은 조언을 포함 :

    이것은 아마도 당신이 얻을 것이다 가장 빠른 것입니다. 단일 서버에 9M 업데이트를 발행하는 무거운 작업이 될 것입니다 것을 깨닫게해야합니다. 당신이 두 번째, 당신은 여전히 ​​거의 한 시간 동안 실행에 대해 얘기하고 / 3K 업데이트를 얻을 수 있다고하자 말.

    그리고 정말 하드웨어 제한 될 것는 "몽고 문제"아니다.

  2. ==============================

    2.db.collection.update 방법 : 내가 사용하고

    db.collection.update 방법 : 내가 사용하고

    // db.collection.update( criteria, objNew, upsert, multi ) // --> for reference
    db.collection.update( { "_id" : { $exists : true } }, objNew, upsert, true);
    
  3. ==============================

    3.덜 구성 할 수 있기 때문에, 더 큰 데이터 세트에 대한 {진정한 멀티} 내가 사용을 권장하지 않습니다.

    덜 구성 할 수 있기 때문에, 더 큰 데이터 세트에 대한 {진정한 멀티} 내가 사용을 권장하지 않습니다.

    대량 삽입을 사용하여 더 좋은 방법.

    대량 작업 스케줄러 작업에 정말 도움이됩니다. 당신이 6 개월 매일 그 오래된 데이터를 삭제해야 말. 대량 작업을 사용합니다. 그것의 빠른 서버를 느리게하지 않으며. 당신이 억 문서를 통해 삽입, 삭제 또는 갱신을 할 때 CPU, 메모리 사용량은 눈에 띄지 않습니다. 내가 찾은 : (.이에 더 많은 연구를 필요로) {멀티 진정한} 당신 만 + 문서를 처리하는 서버를 늦추고

    아래 샘플을 참조하십시오. 그것은 JS는, 스크립트를 쉘뿐만 아니라 노드 프로그램으로 서버에서 실행할 수 있습니다. (사용 NPM 모듈 shelljs 또는이를 유사)

    3.2 이상으로 업데이트하여 MongoDB

    업데이트 다수의 고유 한 문서의 일반적인 방법입니다

    let counter = 0;
    db.myCol.find({}).sort({$natural:1}).limit(1000000).forEach(function(document){
        counter++;
        document.test_value = "just testing" + counter
        db.myCol.save(document)
    });
    

    내가 시도 할 때 그것은 3백10~3백15초했다. 즉 백만 문서를 업데이트하는 5 분 이상입니다.

    내 컬렉션 억 + 문서를 포함, 그래서 속도는 다른 사람과 다를 수 있습니다.

    동일하게하여 일괄 삽입은

        let counter = 0;
    // magic no.- depends on your hardware and document size. - my document size is around 1.5kb-2kb
    // performance reduces when this limit is not in 1500-2500 range.
    // try different range and find fastest bulk limit for your document size or take an average.
    let limitNo = 2222; 
    let bulk = db.myCol.initializeUnorderedBulkOp();
    let noOfDocsToProcess = 1000000;
    db.myCol.find({}).sort({$natural:1}).limit(noOfDocsToProcess).forEach(function(document){
        counter++;
        noOfDocsToProcess --;
        limitNo--;
        bulk.find({_id:document._id}).update({$set:{test_value : "just testing .. " + counter}});
        if(limitNo === 0 || noOfDocsToProcess === 0){
            bulk.execute();
            bulk = db.myCol.initializeUnorderedBulkOp();
            limitNo = 2222;
        }
    });
    

    가장 좋은 시간은 8972 밀리이었다. 그래서 평균에 백만 문서를 업데이트하는 10 초 걸렸습니다. 빠른 옛날 방식에 비해 30 배.

    은 .js 파일의 코드를 넣어 몽고 쉘 스크립트로 실행합니다.

    사람이 더 나은 방법을 발견, 제발 업데이트합니다. 빠른 방법으로 사용 몽고을 할 수 있습니다.

  4. ==============================

    4.확실하지가 빨리 될 것입니다하지만 당신은 멀티 업데이트를 할 수있는 경우. 그냥 업데이 트를 말하는 곳 _id> 0 다음 true로 '다중'플래그를 설정 (이 모든 개체에 대한 사실 것)하고 전체 컬렉션을 반복하지 않고도 동일한 작업을 수행해야합니다.

    확실하지가 빨리 될 것입니다하지만 당신은 멀티 업데이트를 할 수있는 경우. 그냥 업데이 트를 말하는 곳 _id> 0 다음 true로 '다중'플래그를 설정 (이 모든 개체에 대한 사실 것)하고 전체 컬렉션을 반복하지 않고도 동일한 작업을 수행해야합니다.

    이것 좀 봐: MongoDB를 - 서버 사이드 코드 실행

  5. ==============================

    5.몽고 4.2 시작, db.collection.update ()는 마지막으로 다른 필드를 기준으로 필드의 업데이트 / 생성을 허용 집계 파이프 라인을 받아 들일 수있다; 따라서 우리가 완전히 쿼리 서버 측의이 종류를 적용 할 수 있도록 :

    몽고 4.2 시작, db.collection.update ()는 마지막으로 다른 필드를 기준으로 필드의 업데이트 / 생성을 허용 집계 파이프 라인을 받아 들일 수있다; 따라서 우리가 완전히 쿼리 서버 측의이 종류를 적용 할 수 있도록 :

    // { Y: 456,  X: 3 }
    // { Y: 3452, X: 2 }
    db.collection.update(
      {},
      [{ $set: { pid: {
        $sum: [ 2571, { $multiply: [ -1, "$Y" ] }, { $multiply: [ 2572, "$X" ] } ]
      }}}],
      { multi: true }
    )
    // { Y: 456,  X: 3, pid: 9831 }
    // { Y: 3452, X: 2, pid: 4263 }
    
  6. from https://stackoverflow.com/questions/4146452/mongodb-what-is-the-fastest-way-to-update-all-records-in-a-collection by cc-by-sa and MIT license