programing

문서의 다른 필드 값으로 필드 업데이트

oldcodes 2023. 7. 3. 23:10
반응형

문서의 다른 필드 값으로 필드 업데이트

수집품이 있습니다.t1스키마에 다음 필드가 있는 경우

_id, field1, field1

세트를 원합니다field2의 가치field1예를 들어 sql:

update t1 set field1=field2;

MongoDB에서 어떻게 합니까?

여기 좋은 소식과 나쁜 소식이 있습니다.

나쁜 소식은 AFAIK 한 번의 업데이트() 통화로는 할 수 없다는 것입니다. - mongo는 업데이트 중인 현재 개체를 참조하는 것을 지원하지 않습니다.

좋은 소식은 다른 방법이 있다는 것입니다. 예를 들어 각 루프에 대해 를 실행할 수 있습니다.

db.item.find(conditions...).snapshot().forEach( function (doc) {
  doc.field1 = doc.field2; 
  db.item.save(doc); 
});

관리 셸('mongo' 명령)에서 각을 실행하거나 특정 드라이버의 일부 메소드를 통해 실행할 수 있습니다(예: PHP에서는 mongodb와 함께 작동할 것으로 예상합니다).여기에 설명된 대로 http://www.php.net/manual/en/mongodb.execute.php) 을 실행합니다.

버전 3.4부터는 다음 기능을 사용할 수 있습니다.$addFields가장 효율적인 방법인 클라이언트 측 처리 없이 집계 파이프라인 운영자가 이 작업을 수행할 수 있습니다.

db.collection.aggregate(
    [
        { "$addFields": { "field2": "$field1" }},
        { "$out": "collection" }
    ]
)

버전 3.4 이전 버전에서는Cursor기존 "field1" 값으로 새 필드를 추가하려면 operator를 사용합니다.최대 효율성을 위해 "대량" 작업을 사용하여 이 작업을 수행해야 합니다.

MongoDB 3.2는 및 관련 메서드를 더 이상 사용하지 않으므로 3.2 이상에서는 메서드를 사용해야 합니다.

var requests = [];
db.collection.find({}, { 'field1': 1 } ).snapshot().forEach(document => { 
    requests.push( { 
        'updateOne': {
            'filter': { '_id': document._id },
            'update': { '$set': { 'field2': document.field1 } }
        }
    });
    if (requests.length === 1000) {
        //Execute per 1000 operations and re-init
        db.collection.bulkWrite(requests);
        requests = [];
    }
});

if(requests.length > 0) {
    db.collection.bulkWrite(requests);
}

버전 2.6부터 3.0까지BulkAPI.

var bulk = db.collection.initializeUnorderedBulOp();
var count = 0;

db.collection.find({}, { 'field1': 1 }).snapshot().forEach(function(document) { 
    bulk.find({ '_id': document._id }).updateOne( {
        '$set': { 'field2': document.field1 }
    });
    count++;
    if(count%1000 === 0) {
        // Excecute per 1000 operations and re-init
        bulk.execute();
        bulk = db.collection.initializeUnorderedBulkOp();
    }
})

// clean up queues
if(count > 0) {
    bulk.execute();
}

이 작업은 다음을 통해 수행할 수 있습니다.

db.nameOfCollection.find().forEach(
    function (elem) {
        db.nameOfCollection.update(
            {
                _id: elem._id
            },
            {
                $set: {
                    field2: elem.field1
                }
            }
        );
    }
);

언급URL : https://stackoverflow.com/questions/2606657/update-field-with-another-fields-value-in-the-document

반응형