Il mio approccio sarebbe quello di ottenere l'istanza del documento e crearne una nuova dai campi dell'istanza. Sono sicuro che c'è un modo migliore per farlo.Il modo più semplice per copiare/clonare un'istanza di documento mangusta?
risposta
Puoi chiarire cosa intendi per "copia/clona"? Stai andando a cercare di creare un documento duplicato nel database? O stai solo cercando di avere due s nel tuo programma che hanno dati duplicati?
Se lo farete:
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"
});
});
In questo caso, x
e y
saranno due "copie" dello stesso documento all'interno del programma.
In alternativa, se si voleva inserire una nuova copia del documento nel database (anche se con un diverso _id
presumo), che sarebbe simile a questa:
Model.findById(yourid).exec(
function(err, doc) {
var d1 = doc;
d1._id = /* set a new _id here */;
d1.save(callback);
}
);
Oppure, se si sta facendo questo fin dall'inizio, alias creato qualche documento d1
, si può chiamare save
due volte senza impostare i _id
:
var d1 = new Model({ name: "John Doe", age: 54 });
d1.save(callback);
d1.save(callback);
ci saranno ora due documenti con differenti _id
e tutti gli altri campi sono identici nel tuo database.
Questo chiarisce un po 'le cose?
Il seguente codice per clonare i documenti in risposta di Amelia sopra non funziona:
Model.findById(yourid).exec(
function(err, doc) {
var d1 = doc;
d1._id = /* set a new _id here */;
d1.save(callback);
}
);
È inoltre necessario reimpostare
d1.isNew = true;
come in:
Model.findById(yourid).exec(
function(err, doc) {
doc._id = mongoose.Types.ObjectId();
doc.isNew = true; //<--------------------IMPORTANT
doc.save(callback);
}
);
grazie per il doc.isNew :) – victorkurauchi
Salvato la mia vita (sorta di) :) – JoeTidee
Salvato un'altra vita con il doc.isNuovo. Grazie! – jimmy
Il codice seguente per clonare i documenti:
Model.findById(yourid).exec(
function(err, doc) {
var newdoc = new Model(doc);
newdoc ._id = mongoose.Types.ObjectId();
newdoc .save(callback);
}
);
Per sufficiente clonare utilizzare questo:
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);
});
Sì, in effetti, ho finito per ottenere il 'doc', rimuovendo' _id' e salvare :) – fusio
Sono contento di sentire ha funzionato! – Amalia
Come hai rimosso _id? – JoeTidee