我的方法是获取文档实例,然后从实例字段创建一个新的文档。我相信有更好的方法来做到这一点。
你需要重置 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
,但其他所有字段都相同。
这样是否更加清晰易懂了呢?
delete doc._id
来从 doc
对象中删除 _id
属性! - Will Bricknernew Model(doc.toObject())
。 - losnir我的观点:
const doc = await DocModel.findById(id);
let obj = doc.toObject();
delete obj._id;
const docClone = new DocModel(obj);
await docClone.save();
exec
不是多余的吗? - sean//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();
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 分配新的 _id。
将 searchBy 更改为您要查找文档的内容。将 collectionA 和 collectionB 更改为要创建副本的集合名称。目前,我们正在 collectionA 中搜索并将数据复制到 collectionB 中。
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;