복붙노트

[MONGODB] 어떻게 MongoDB를 문서의 _id를 업데이트?

MONGODB

어떻게 MongoDB를 문서의 _id를 업데이트?

나는 하나 개의 문서의 _id 필드를 업데이트합니다. 나는 그것이 정말 좋은의 연습이 아니다 알고있다. 그러나 몇 가지 기술적 인 이유로, 나는 그것을 업데이트 할 필요가있다. 나는 그것을 업데이트하려고하면 내가 얻을 :

> db.clients.update({ _id: ObjectId("123")}, { $set: { _id: ObjectId("456")}})

Performing an update on the path '_id' would modify the immutable field '_id'

그리고 업데이트가 이루어지지 않습니다. 어떻게 업데이트 할 수 있습니다?

해결법

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

    1.당신은 그것을 업데이트 할 수 없습니다. 새 _id를 사용하여 문서를 저장해야하고 기존 문서를 제거 할 수 있습니다.

    당신은 그것을 업데이트 할 수 없습니다. 새 _id를 사용하여 문서를 저장해야하고 기존 문서를 제거 할 수 있습니다.

    // store the document in a variable
    doc = db.clients.findOne({_id: ObjectId("4cc45467c55f4d2d2a000002")})
    
    // set a new _id on the document
    doc._id = ObjectId("4c8a331bda76c559ef000004")
    
    // insert the document, using the new _id
    db.clients.insert(doc)
    
    // remove the document with the old _id
    db.clients.remove({_id: ObjectId("4cc45467c55f4d2d2a000002")})
    
  2. ==============================

    2.전체 컬렉션을 당신은 또한 루프를 사용할 수 있습니다 위해 그것을하기 위해 (닐스 예 기준) :

    전체 컬렉션을 당신은 또한 루프를 사용할 수 있습니다 위해 그것을하기 위해 (닐스 예 기준) :

    db.status.find().forEach(function(doc){ 
        doc._id=doc.UserId; db.status_new.insert(doc);
    });
    db.status_new.renameCollection("status", true);
    

    이 경우 사용자 아이디는 새로운 ID 내가 사용하고 싶었습니다

  3. ==============================

    3.경우에, 당신은 (당신이 어떤 _ids 접두사하려는 경우, 예를 들어) 같은 컬렉션 _id의 이름을 변경하려면 :

    경우에, 당신은 (당신이 어떤 _ids 접두사하려는 경우, 예를 들어) 같은 컬렉션 _id의 이름을 변경하려면 :

    db.someCollection.find().snapshot().forEach(function(doc) { 
       if (doc._id.indexOf("2019:") != 0) {
           print("Processing: " + doc._id);
           var oldDocId = doc._id;
           doc._id = "2019:" + doc._id; 
           db.someCollection.insert(doc);
           db.someCollection.remove({_id: oldDocId});
       }
    });
    

    경우 (doc._id.indexOf ( "2019")! = 0) {... 대해 forEach가 삽입 된 문서를 집어 때문에, 무한 루프를 방지하기 위해 필요하더라도 throught를 .snapshot () 메소드를 사용했다.

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

    4.여기에 내가 루프와 오래된 문서 제거를위한 여러 요청을 피하기 해결책을 가지고 있습니다.

    여기에 내가 루프와 오래된 문서 제거를위한 여러 요청을 피하기 해결책을 가지고 있습니다.

    () ObjectId가 : _id : 당신은 쉽게 수동으로 같은 것을 사용하여 새로운 아이디어를 만들 수 있습니다 그러나 알고 몽고가 자동으로 실종, 당신은 문서의 모든 필드를 포함하는 $ 프로젝트를 만들 집계 사용할 수있는 경우 _id를 할당하지만, 필드 _id를 생략합니다. 그런 다음 밖으로 $로 저장할 수 있습니다

    문서 인 경우 그래서 :

    {
    "_id":ObjectId("5b5ed345cfbce6787588e480"),
    "title": "foo",
    "description": "bar"
    }
    

    그런 다음 쿼리는 다음과 같습니다

        db.getCollection('myCollection').aggregate([
            {$match:
                 {_id: ObjectId("5b5ed345cfbce6787588e480")}
            }        
            {$project:
                {
                 title: '$title',
                 description: '$description'             
                }     
            },
            {$out: 'myCollection'}
        ])
    
  5. from https://stackoverflow.com/questions/4012855/how-update-the-id-of-one-mongodb-document by cc-by-sa and MIT license