2012-11-12 7 views
31

Ho una richiesta che corpo contiene dati e _idMongoose.js: come implementare la creazione o l'aggiornamento?

Qual è il modo migliore per implementare il codice che verrà aggiornato se il record con _id esiste e ne creerà uno è non c'è nessuno? Il mio codice:

var obj = req.body; 
Model.findById(obj._id, function(err, data){ 
    if (!data){ 
     var model = new Model(obj) 
     model.save(function(err, data){ 
      res.send({method: 'create', error: err, data: data}) 
     }) 
    } else { 
     Model.findByIdAndUpdate(obj._id, obj, function(){ 
      res.send({method: 'update', error: err, data: data}) 
     }) 
    } 

Sto solo pensando che forse c'è un modo migliore per farlo.

risposta

59

Potete farlo con un unico upsert:

var obj = req.body; 
var id = obj._id; 
delete obj._id; 
if (id) { 
    Model.update({_id: id}, obj, {upsert: true}, function (err) {...}); 
} 

L'avvertenza è che non verranno applicate le impostazioni predefinite e middleware (se presente) del modello.

Mongoose 4.x Aggiornamento

È ora possibile utilizzare l'opzione setDefaultOnInsert di applicare anche le impostazioni predefinite se l'upsert crea un nuovo documento.

Model.update({_id: id}, obj, {upsert: true, setDefaultsOnInsert: true}, cb); 
+0

Il problema è che "obj" contiene _id, e in caso di aggiornamento ho bisogno di rimuoverlo aggiornamento prima o ottengo "Mod su _id non ammesso" l'errore – WHITECOLOR

+1

@WHITECOLOR Buon punto. Aggiornato il codice per rimuoverlo prima dell'aggiornamento. – JohnnyHK

+0

c'è lo sfregamento. Voglio creato di nuovo (se non esiste) Articolo per avere _id uguale a obj._id, Se per rimuovere _id da obj prima di creare un'operazione, mongo creerà nuovo _id. – WHITECOLOR

Problemi correlati