mongodb - importar - ¿La forma más fácil de copiar/clonar una instancia de documento de mangosta?
guardar base de datos mongodb (4)
Mi enfoque sería obtener la instancia del documento y crear una nueva desde los campos de la instancia. Estoy seguro de que hay una mejor manera de hacerlo.
¿Puedes aclarar a qué te refieres con "copiar / clonar"? ¿Vas a intentar crear un documento duplicado en la base de datos? ¿O solo intentas tener dos var
en tu programa que tienen datos duplicados?
Si acabas de hacer:
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"
});
});
En este caso, y
serán dos "copias" del mismo documento dentro de su programa.
Alternativamente, si quisiera insertar una nueva copia del documento en la base de datos (aunque _id
que con un _id
diferente), se vería así:
Model.findById(yourid).exec(
function(err, doc) {
var d1 = doc;
d1._id = /* set a new _id here */;
d1.save(callback);
}
);
O si está haciendo esto desde el principio, alias que creó algún documento d1
, puede simplemente save
dos veces sin configurar el _id
:
var d1 = new Model({ name: "John Doe", age: 54 });
d1.save(callback);
d1.save(callback);
Ahora habrá dos documentos con diferentes _id
''sy todos los demás campos idénticos en su base de datos.
¿Esto aclara un poco las cosas?
El siguiente código para clonar documentos:
Model.findById(yourid).exec(
function(err, doc) {
var newdoc = new Model(doc);
newdoc ._id = mongoose.Types.ObjectId();
newdoc .save(callback);
}
);
El siguiente código para clonar documentos en la respuesta anterior de Amelia no funciona :
Model.findById(yourid).exec(
function(err, doc) {
var d1 = doc;
d1._id = /* set a new _id here */;
d1.save(callback);
}
);
También debe restablecer
d1.isNew = true;
como en:
Model.findById(yourid).exec(
function(err, doc) {
doc._id = mongoose.Types.ObjectId();
doc.isNew = true; //<--------------------IMPORTANT
doc.save(callback);
}
);
Para clonar simplemente usa esto:
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);
});