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
'programing' 카테고리의 다른 글
| 뷰가 스키마 바운드되지 않았으므로 'View_Table_Name' 뷰에 인덱스를 만들 수 없습니다. (0) | 2023.06.27 |
|---|---|
| mongoose/mongodb 쿼리 다중 정렬 (0) | 2023.06.27 |
| Oracle UNION 및 ORDER BY에 대한 궁금한 문제 (0) | 2023.06.27 |
| GitHub 프로젝트를 다운로드하는 가장 빠른 방법 (0) | 2023.06.27 |
| git-diff에서 패치 호환 출력을 받을 수 있습니까? (0) | 2023.06.27 |