2013-08-19 5 views

risposta

7

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?

+3

Sì, in effetti, ho finito per ottenere il 'doc', rimuovendo' _id' e salvare :) – fusio

+0

Sono contento di sentire ha funzionato! – Amalia

+0

Come hai rimosso _id? – JoeTidee

44

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

grazie per il doc.isNew :) – victorkurauchi

+0

Salvato la mia vita (sorta di) :) – JoeTidee

+0

Salvato un'altra vita con il doc.isNuovo. Grazie! – jimmy

0

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

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