复制/克隆mongoose文档实例的最简单方法是什么?

fus*_*sio 16 document instance mongoose mongodb

我的方法是获取文档实例,并从实例字段中创建一个新实例.我相信有更好的方法可以做到这一点.

小智 67

以下用于克隆Amelia上面的响应中的文档的代码不起作用:

Model.findById(yourid).exec(
    function(err, doc) {
        var d1 = doc;
        d1._id = /* set a new _id here */;
        d1.save(callback);
    }
);
Run Code Online (Sandbox Code Playgroud)

您还需要重置d1.isNew = true;为:

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

  • 您可以评论她的答案或编辑答案! (3认同)
  • 使用 doc.isNew 挽救了另一条生命。谢谢! (2认同)

Cai*_*tos 11

我的两分钱:

const doc = await DocModel.findById(id);
let obj = doc.toObject();
delete obj._id;
const docClone = new DocModel(obj);
await docClone.save();
Run Code Online (Sandbox Code Playgroud)


Ama*_*lia 10

你能澄清"复制/克隆"的含义吗?你打算在数据库中创建一个重复的文档吗?或者你只是想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"
            }); 
    });
Run Code Online (Sandbox Code Playgroud)

在这种情况下,x并且y将你的程序中的两个相同的文档的"副本".

或者,如果您想将doc的新副本插入到数据库中(尽管_id我假设不同),它将如下所示:

Model.findById(yourid).exec(
    function(err, doc) {
        var d1 = doc;
        d1._id = /* set a new _id here */;
        d1.save(callback);
    }
);
Run Code Online (Sandbox Code Playgroud)

或者如果你从一开始就这样做,也就是你创建了一些文档d1,你只需调用save两次而不设置_id:

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

现在将有两个文档_id在您的数据库中具有不同的和所有其他字段相同.

这会澄清一些事情吗?

  • 是的,的确,我最终获得了`doc`,删除了`_id`并保存:) (3认同)
  • 不幸的是,这并没有回答这个问题。要真正克隆文档,您可以执行以下操作:`new Model(doc.toObject())`。 (3认同)
  • @JoeTidee 您可以使用`delete doc._id` 将从`doc` 对象中删除`_id` 属性! (2认同)