Det finns två sätt att uppdatera dokument i mongodb:
-
hitta dokumentet, ta det till servern, ändra det och spara det sedan tillbaka till mongodb.
-
ge bara instruktion till mongodb att hitta dokument, ändra det; sedan efter att mongodb är klar, returnera resultatet/felet som återuppringning.
I din kod blandar du båda metoderna.
-
med user.save(), först söker du i databasen med user.findOne och drar den till server(nodejs), nu finns den i din dators minne.sedan kan du manuellt ändra data och slutligen spara den till mongodb med user. save()
User.findOne({ userName: req.params.userName}, function(err, user) { if (err) res.send(err); //this user now lives in your memory, you can manually edit it user.username = "somename"; user.competitorAnalysis.firstObservation = "somethingelse"; // after you finish editing, you can save it to database or send it to client user.save(function(err) { if (err) return res.send(err); return res.json({ message: 'User updated!' }); });
-
den andra är att använda User.findOneAndUpdate().. Detta är att föredra, istället för user.findOne() sedan user.update(); eftersom de i princip söker i databasen två gånger. först för att hittaOne(), och sök igen för att uppdatera()
Hur som helst, den andra metoden säger åt mongodb att uppdatera data utan att först ta till servern. Därefter kommer du att få den uppdaterade filen (eller felet) som återuppringning först efter att mongodb är klar med sin åtgärd.
User.findOneAndUpdate({ userName: req.params.userName},
{
$set: { "competitorAnalysis.firstObservation" : req.body.firstObservation,
"competitorAnalysis.secondObservation" : req.body.secondObservation,
"competitorAnalysis.thirdObservation" : req.body.thirdObservation,
"competitorAnalysis.brandName" : req.body.brandName,
"competitorAnalysis.productCategory" : req.body.productCategory
} },
{ upsert: true },
function(err, user) {
//after mongodb is done updating, you are receiving the updated file as callback
// now you can send the error or updated file to client
if (err)
res.send(err);
return res.json({ message: 'User updated!' });
});