bestsource

mongodb에서 업데이트 문서 수를 제한하는 방법

bestsource 2023. 5. 9. 22:52
반응형

mongodb에서 업데이트 문서 수를 제한하는 방법

다음과 유사한 것을 구현하는 방법db.collection.find().limit(10)문서를 업데이트하는 동안?

저는 이제 문서를 얻는 것과 같은 정말 형편없는 것을 사용하고 있습니다.db.collection.find().limit()업데이트합니다.

일반적으로 주어진 레코드 수를 반환하고 각 레코드의 필드를 하나씩 변경합니다.

감사해요.

사용할 수 있는 항목:

db.collection.find().limit(NUMBER_OF_ITEMS_YOU_WANT_TO_UPDATE).forEach(
    function (e) {
        e.fieldToChange = "blah";
        ....
        db.collection.save(e);
    }
);

(각 코드에 대한 크레딧:MongoDB: 동일한 문서의 데이터를 사용하여 문서 업데이트)

이렇게 하면 지정한 항목 수만 변경됩니다.따라서 값이 1인 "newField"라는 필드를 "collection" 안에 있는 항목의 절반에만 추가하려면, 예를 들어,

db.collection.find().limit(db.collection.count() / 2).forEach(
    function (e) {
        e.newField = 1;
        db.collection.save(e);
    }
);

그런 다음 나머지 절반에도 "newField"가 있지만 값이 2인 경우 newField가 존재하지 않는 조건으로 업데이트를 수행할 수 있습니다.

db.collection.update( { newField : { $exists : false } }, { $set : { newField : 2 } }, {multi : true} );

사용.forEach각 문서를 개별적으로 업데이트하는 속도가 느립니다.다음을 사용하여 문서를 대량으로 업데이트할 수 있습니다.

ids = db.collection.find(<condition>).limit(<limit>).map(
    function(doc) {
        return doc._id;
    }
);
db.collection.updateMany({_id: {$in: ids}}, <update>})

모든 개체에 대해 반복한 다음 개별적으로 업데이트하는 솔루션은 매우 느립니다.

모든 파일을 검색한 후 다음을 사용하여 동시에 업데이트$in더 효율적입니다.

ids = People.where(firstname: 'Pablo').limit(10000).only(:_id).to_a.map(&:id)
People.in(_id: ids).update_all(lastname: 'Cantero')

쿼리는 Mongoid를 사용하여 작성되지만 Mongo Shell에서도 쉽게 다시 작성할 수 있습니다.

불행하게도 당신이 가지고 있는 해결책이 그것을 할 수 있는 유일한 방법입니다 AFAIK.부울 플래그가 있습니다.multi그러면 모든 일치 항목이 업데이트됩니다(시)true) 또는 첫 번째 일치 항목을 업데이트합니다.false).

답변에 나와 있듯이 업데이트(또는 삭제)할 문서 수를 1보다 큰 값으로 제한할 방법이 없습니다. 다음과 같은 방법을 사용하는 해결 방법:

db.collection.find(<condition>).limit(<limit>).forEach(function(doc){db.collection.update({_id:doc._id},{<your update>})})

ID가 ObjectId가 아닌 시퀀스 번호인 경우 for 루프에서 이 작업을 수행할 수 있습니다.

let batchSize= 10;
for (let i = 0; i <= 1000000; i += batchSize) { 
  db.collection.update({$and :[{"_id": {$lte: i+batchSize}}, {"_id": {$gt: i}}]}),{<your update>})
}
    let fetchStandby = await db.model.distinct("key",{});
    fetchStandby = fetchStandby.slice(0, no_of_docs_to_be_updated)
    let fetch = await db.model.updateMany({
        key: { $in: fetchStandby }
    }, {
        $set:{"qc.status": "pending"}
    })

저도 최근에 이런 걸 원했어요.$in에서 업데이트하기 위해 _id의 긴 목록을 쿼리하는 것도 아마 느릴 것이라고 생각하기 때문에 aggregation+merge를 사용하려고 했습니다.

while (true) {
    const record = db.records.findOne({ isArchived: false }, {_id: 1})
    if (!record) {
        print("No more records")
        break
    }
    
    db.records.aggregate([
        { $match: { isArchived: false } },
        { $limit: 100 },
        { 
            $project: { 
                _id: 1, 
                isArchived: { 
                    $literal: true 
                }, 
                updatedAt: {
                    $literal: new Date()      
                } 
            } 
        },
        { 
            $merge: {
                into: "records",
                on: "_id",
                whenMatched: "merge"
            }
        }
    ])   
    print("Done update")
}

하지만 $in으로 대량 업데이트하는 것보다 이것이 더 나은지 나쁜지 자유롭게 의견을 내십시오.

언급URL : https://stackoverflow.com/questions/6590890/how-to-limit-number-of-updating-documents-in-mongodb

반응형