mongodb 复制/克隆mongoose文档示例的最简单方法?

dldeef67  于 2023-08-04  发布在  Go
关注(0)|答案(9)|浏览(137)

我的方法是获取文档示例,并从示例字段创建一个新示例。我相信有更好的办法。

lvjbypge

lvjbypge1#

您需要重置d1.isNew = true;,如下所示:

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

字符串

7fhtutme

7fhtutme2#

你能解释一下你所说的“复制/克隆”是什么意思吗?您是否要尝试在数据库中创建重复的文档?或者你只是想在你的程序中有两个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"
            }); 
    });

字符串
在这种情况下,xy将是程序中同一文档的两个“副本”。
或者,如果您想将文档的新副本插入到数据库中(尽管我假设使用不同的_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,而数据库中的所有其他字段都相同。
这是不是有点澄清了?

tktrz96b

tktrz96b3#

我的两分钱:

const doc = await DocModel.findById(id);
let obj = doc.toObject();
delete obj._id;
const docClone = new DocModel(obj);
await docClone.save();

字符串

xggvc2p6

xggvc2p64#

所以,这些答案中的很多都适用于简单的文档,但是当您试图对复杂文档进行深度克隆时,可能会出现错误情况。
例如,如果你有子文档数组,你可能会在复制的文档中得到duplicate _ids,这可能会在以后导致一些小的bug。
要对 Mongoose 文档进行深度克隆,我建议尝试以下操作:

//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字段正确克隆对象的每个部分。

vsaztqbk

vsaztqbk5#

以下代码用于克隆文档:

Model.findById(yourid).exec(
        function(err, doc) {
            var newdoc = new Model(doc);
            newdoc._id = mongoose.Types.ObjectId();
            newdoc.save(callback);
        }
    );

字符串

7fhtutme

7fhtutme6#

对于简单的克隆,请使用以下命令:

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);
    });

字符串

dgiusagp

dgiusagp7#

const cloneDoc = (doc, model)=>{
  const copyDoc = new Model({
    ...doc.toObject(),
    _id: undefined,
  });
  copyDoc.isNew = true;
  return copyDoc;
}

字符串

bjg7j2ky

bjg7j2ky8#

要将文档复制到同一集合或不同集合中,首先获取(查询)数据并复制数据。然后从新列表中删除_id,因为不能从当前数据中删除。这将允许您插入一条带有从MongoDB分配的new _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();
    });

字符串

cl25kdpy

cl25kdpy9#

基本上可以使用.clone()来获取副本。

const cars = Cars.find();
const carsCopy = cars.clone();

await cars;
await carsCopy;

字符串
https://mongoosejs.com/docs/api.html#schema_Schema-clone

相关问题