복붙노트

[MONGODB] 문서에서 다른 필드의 값을 업데이트 필드 [중복]

MONGODB

문서에서 다른 필드의 값을 업데이트 필드 [중복]

나는 그것의 스키마에 다음 필드 컬렉션 T1이

_id, field1, field1

나는 SQL과 같은 설정 FIELD2의 값 필드 1을 원하는 :

update t1 set field1=field2;

어떻게하여 MongoDB에서해야합니까?

해결법

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

    1.좋은 여기 나쁜 소식.

    좋은 여기 나쁜 소식.

    몽고를 업데이트에서 현재 객체를 참조 지원하지 않습니다 - 나쁜 소식은 AFAIK 당신이 하나의 갱신 () 호출을 할 수 없다는 것입니다.

    좋은 소식은 그것을 할 수있는 다른 방법은 예를 들어 있다는 것입니다 당신은 foreach 루프를 실행할 수 있습니다 :

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

    당신은 ( '몽고'명령) 관리자 쉘에 대해 forEach를 실행하거나 특정 드라이버의 몇 가지 방법을 통해 (예를 들어, PHP에서 나는 mongodb.execute과 함께 작업에 기대 () 여기에 설명 : HTTP : / /www.php.net/manual/en/mongodb.execute.php)

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

    2.버전 3.4에서 시작, 우리는 $ addFields이 가장 효율적인 방법입니다 클라이언트 측 처리없이이에 파이프 라인 연산자를 응집 할 수 있습니다.

    버전 3.4에서 시작, 우리는 $ addFields이 가장 효율적인 방법입니다 클라이언트 측 처리없이이에 파이프 라인 연산자를 응집 할 수 있습니다.

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

    버전 3.4 이전에 우리는 반복 커서 오브젝트를 필요로하고 기존의 "필드 1"값으로 새로운 필드를 추가 $ 집합 연산자를 사용합니다. 당신은 최대 효율이 사용하는 "대량"작업을 수행해야합니다.

    MongoDB를 3.2 deprecates 벌크 () 따라서 3.2 관련 방법은 위쪽으로 당신은 bulkWrite 방법을 사용해야합니다.

    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으로 당신은 대량 API를 사용할 수 있습니다.

    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();
    }
    
  3. ==============================

    3.이를 통해 수행 할 수 있습니다 :

    이를 통해 수행 할 수 있습니다 :

    db.nameOfCollection.find().forEach(
        function (elem) {
            db.nameOfCollection.update(
                {
                    _id: elem._id
                },
                {
                    $set: {
                        field2: elem.field1
                    }
                }
            );
        }
    );
    
  4. from https://stackoverflow.com/questions/2606657/update-field-with-another-fields-value-in-the-document by cc-by-sa and MIT license