2012-11-12 8 views
31

Mam żądanie, który zawiera dane i _idMongoose.js: jak zaimplementować tworzenie lub aktualizację?

Jaki jest lepszy sposób na wdrożenie kodu, który będzie aktualizowany, jeśli rekord z _id istnieje i utworzy go, czy nie ma nikogo? Mój kod:

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

Po prostu myślę, że może jest lepszy sposób na zrobienie tego.

Odpowiedz

59

Można to zrobić za pomocą jednego upsert:

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

Zastrzeżenie jest to, że nie będą stosowane domyślnie i middleware (jeśli występują) Twojego modelu.

Mongoose 4.x Aktualizacja

Teraz można użyć opcji setDefaultOnInsert również zastosować domyślne jeśli upsert tworzy nowy dokument.

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

Problemem jest to, że „obj” zawiera _id, aw przypadku aktualizacji muszę go usunąć poprzednią aktualizację lub uzyskać „Mod na _id niedozwolone” Błąd – WHITECOLOR

+1

@WHITECOLOR Dobry punkt. Zaktualizowano kod, aby usunąć ten błąd przed aktualizacją. – JohnnyHK

+0

jest pocieranie. Chcę, aby nowo utworzony (jeśli nie istnieje) Element miał _id równy obj._id, Jeśli chcesz usunąć _id z obj przed rozpoczęciem operacji, mongo utworzy nowy _id. – WHITECOLOR

Powiązane problemy