programing

mongoose 문서 인스턴스를 복사/복제하는 가장 쉬운 방법은 무엇입니까?

elecom 2023. 6. 27. 21:42
반응형

mongoose 문서 인스턴스를 복사/복제하는 가장 쉬운 방법은 무엇입니까?

문서 인스턴스를 가져와서 인스턴스 필드에서 새 인스턴스를 만드는 방법이 있습니다.저는 그것을 하는 더 좋은 방법이 있다고 확신합니다.

재설정해야 합니다.d1.isNew = true;다음과 같이:

Model.findById(yourid).exec(
    function(err, doc) {
        doc._id = mongoose.Types.ObjectId();
        doc.isNew = true; //<--------------------IMPORTANT
        doc.save(callback);
    }
);

"복사/복제"의 의미를 명확히 설명할 수 있습니까?데이터베이스에 중복 문서를 작성하려고 합니까?아니면 그냥 두 개를 가지려는 겁니까?var당신의 프로그램에 중복된 데이터가 있습니까?

만약 당신이 그냥 한다면:

Model.findById(yourid).exec(
    function(err, doc) { 
        var x = doc; 
        Model.findById(yourid).exec(
            function(err, doc2) {
                var y = doc2;
                // right now, x.name and y.name are the same
                x.name = "name_x";
                y.name = "name_y";
                console.log(x.name); // prints "name_x"
                console.log(y.name); // prints "name_y"
            }); 
    });

이 경우에는,x그리고.y프로그램 내에서 동일한 문서의 두 개의 "문서"가 됩니다.

또는 데이터베이스에 문서의 새 사본을 삽입하려는 경우(다른 사본을 사용하는 경우_id예를 들어, 다음과 같습니다.

Model.findById(yourid).exec(
    function(err, doc) {
        var d1 = doc;
        d1._id = /* set a new _id here */;
        d1.isNew = true;
        d1.save(callback);
    }
);

또는 처음부터 이 작업을 수행하는 경우에는 문서를 작성한 것으로 간주합니다.d1그냥 전화하시면 됩니다.save설정하지 않고 두 번_id:

var d1 = new Model({ name: "John Doe", age: 54 });
d1.save(callback);
d1.save(callback);

이제 서로 다른 두 개의 문서가 있습니다._id데이터베이스에 있는 모든 필드가 동일합니다.

이것으로 상황이 좀 명확해집니까?

내 2센트야.

const doc = await DocModel.findById(id);
let obj = doc.toObject();
delete obj._id;
const docClone = new DocModel(obj);
await docClone.save();

따라서 이러한 답변의 대부분은 단순한 문서에 적합하지만 복잡한 문서의 심층 복제를 시도할 때 오류가 발생할 수 있습니다.

예를 들어, 하위 문서 배열이 있는 경우 복사된 문서에 중복된 _ids가 나타날 수 있으며, 이는 나중에 미묘한 버그를 일으킬 수 있습니다.

몽구스 의사의 심층 복제를 하기 위해서는 다음과 같은 방법을 시도해 보는 것이 좋습니다.

//recursively remove _id fields
function cleanId(obj) {
    if (Array.isArray(obj))
        obj.forEach(cleanId);
    else {
        delete obj['_id'];
        for (let key in obj)
            if (typeof obj[key] == 'object')
                cleanId(obj[key]);
    }
}

let some_doc = await SomeModel.findOne({_id: some_id});
let new_doc_object = cleanId(some_doc.toObject());
let new_doc = new SomeModel(new_doc_object);
await new_doc.save();

이는 상당히 안전한 접근 방식이 될 것이며 저장 시 새로 생성된 _id 필드를 사용하여 개체의 모든 부분을 올바르게 복제할 수 있습니다.

문서를 복제할 다음 코드:

Model.findById(yourid).exec(
        function(err, doc) {
            var newdoc = new Model(doc);
            newdoc._id = mongoose.Types.ObjectId();
            newdoc.save(callback);
        }
    );

단순 복제의 경우 다음을 사용합니다.

Context.findOne({
    _id: context._id
})
    .then(function(c) {
        c._id = undefined;
        c.name = context.name;
        c.address = context.address;
        c.created = Date.now();
        return Context.create(c.toObject());
    }).then(function(c) {
        return res.json({
            success: true,
            context: context
        });
    }).catch(function(err) {
        next(err, req, res);
    });
const cloneDoc = (doc, model)=>{
  const copyDoc = new Model({
    ...doc.toObject(),
    _id: undefined,
  });
  copyDoc.isNew = true;
  return copyDoc;
}

문서를 동일한 컬렉션 또는 다른 컬렉션으로 복사하려면 먼저 데이터를 가져오고(쿼리) 데이터의 복사본을 만듭니다.이후에 _id를 현재 데이터에서 제거할 수 없으므로 새 목록에서 제거합니다.이렇게 하면 mongodb에서 할당된 new_id로 새 레코드를 삽입할 수 있습니다.

searchBy를 문서를 찾으려는 대상으로 변경합니다. collectionA 및 collectionB를 복사할 컬렉션의 이름으로 변경합니다.현재 우리는 컬렉션 A에서 검색하고 컬렉션 B의 데이터를 복사하고 있습니다.

collectionA.find(searchBy).exec(function (err, doc) {
      // create a new copy
      let newDoc = { ...doc[0] }._doc;

      // delete property from new copy (remove _id).
      delete newDoc._id;

      // insert copy into db
      var newdoc = new collectionB(newDoc);
      newdoc.save();
    });

기본적으로 .clone()을 사용하여 복사본을 가져올 수 있습니다.

const cars = Cars.find();
const carsCopy = cars.clone();

await cars;
await carsCopy;

https://mongoosejs.com/docs/api.html#schema_Schema-clone

언급URL : https://stackoverflow.com/questions/18324843/easiest-way-to-copy-clone-a-mongoose-document-instance

반응형