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"
});
});
//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();
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();
});
9条答案
按热度按时间lvjbypge1#
您需要重置
d1.isNew = true;
,如下所示:字符串
7fhtutme2#
你能解释一下你所说的“复制/克隆”是什么意思吗?您是否要尝试在数据库中创建重复的文档?或者你只是想在你的程序中有两个
var
,它们有重复的数据?如果你只是这样做:
字符串
在这种情况下,
x
和y
将是程序中同一文档的两个“副本”。或者,如果您想将文档的新副本插入到数据库中(尽管我假设使用不同的
_id
),则如下所示:型
或者,如果你从一开始就这样做,也就是你创建了一些文档
d1
,你可以只调用save
两次,而不设置_id
:型
现在将有两个文档具有不同的
_id
,而数据库中的所有其他字段都相同。这是不是有点澄清了?
tktrz96b3#
我的两分钱:
字符串
xggvc2p64#
所以,这些答案中的很多都适用于简单的文档,但是当您试图对复杂文档进行深度克隆时,可能会出现错误情况。
例如,如果你有子文档数组,你可能会在复制的文档中得到duplicate _ids,这可能会在以后导致一些小的bug。
要对 Mongoose 文档进行深度克隆,我建议尝试以下操作:
字符串
这将是一种非常安全的方法,并将确保在保存时使用新生成的_id字段正确克隆对象的每个部分。
vsaztqbk5#
以下代码用于克隆文档:
字符串
7fhtutme6#
对于简单的克隆,请使用以下命令:
字符串
dgiusagp7#
字符串
bjg7j2ky8#
要将文档复制到同一集合或不同集合中,首先获取(查询)数据并复制数据。然后从新列表中删除_id,因为不能从当前数据中删除。这将允许您插入一条带有从MongoDB分配的new _id的新记录
将searchBy更改为您尝试查找文档的依据。将collectionA和collectionB更改为要复制到的集合的名称。目前我们正在collectionA中搜索并复制collectionB中的数据
字符串
cl25kdpy9#
基本上可以使用.clone()来获取副本。
字符串
https://mongoosejs.com/docs/api.html#schema_Schema-clone