Cách tiếp cận của tôi là lấy cá thể tài liệu và tạo một đối tượng mới từ các trường thể hiện. Tôi chắc chắn có một cách tốt hơn để làm điều đó.Cách dễ nhất để sao chép/sao chép một cá thể tài liệu mongoose?
Trả lời
Bạn có thể làm rõ ý nghĩa của từ "sao chép/sao chép" không? Bạn đang cố gắng tạo một tài liệu trùng lặp trong cơ sở dữ liệu? Hay bạn chỉ đang cố gắng có hai số var
trong chương trình có dữ liệu trùng lặp?
Nếu bạn chỉ làm:
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"
});
});
Trong trường hợp này, x
và y
sẽ có hai "bản sao" của cùng một tài liệu trong chương trình của bạn.
Ngoài ra, nếu bạn muốn để chèn một bản sao mới của doc vào cơ sở dữ liệu (mặc dù với một khác nhau _id
tôi giả sử), mà sẽ trông như thế này:
Model.findById(yourid).exec(
function(err, doc) {
var d1 = doc;
d1._id = /* set a new _id here */;
d1.save(callback);
}
);
Hoặc nếu bạn đang làm điều này ngay từ đầu, hay còn gọi là bạn đã tạo một số tài liệu d1
, bạn chỉ có thể gọi save
hai lần mà không cần thiết lập các _id
:
var d1 = new Model({ name: "John Doe", age: 54 });
d1.save(callback);
d1.save(callback);
nay sẽ có hai tài liệu với khác nhau _id
và tất cả các trường khác giống nhau trong cơ sở dữ liệu của bạn.
Điều này có làm rõ mọi thứ một chút không?
Các mã sau đây để sao chép tài liệu trong phản ứng của Amelia trên không hoạt động:
Model.findById(yourid).exec(
function(err, doc) {
var d1 = doc;
d1._id = /* set a new _id here */;
d1.save(callback);
}
);
Bạn cũng cần phải thiết lập lại
d1.isNew = true;
như trong:
Model.findById(yourid).exec(
function(err, doc) {
doc._id = mongoose.Types.ObjectId();
doc.isNew = true; //<--------------------IMPORTANT
doc.save(callback);
}
);
cảm ơn doc.isNew :) – victorkurauchi
Đã lưu cuộc sống của tôi (sắp xếp) :) – JoeTidee
Đã lưu một cuộc sống khác bằng doc.isNew. Cảm ơn! – jimmy
Các mã sau để sao chép tài liệu:
Model.findById(yourid).exec(
function(err, doc) {
var newdoc = new Model(doc);
newdoc ._id = mongoose.Types.ObjectId();
newdoc .save(callback);
}
);
Đối với chỉ đơn giản là sao chép sử dụng này:
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);
});
Vâng, thực sự, tôi đã kết thúc nhận được 'doc', loại bỏ' _id' và tiết kiệm :) – fusio
Vui mừng khi nghe nó làm việc ra! – Amalia
Bạn đã xóa _id bằng cách nào? – JoeTidee