Esistono 2 modi per aggiornare i documenti in mongodb:
-
trova il documento, portalo sul server, modificalo, quindi salvalo di nuovo su mongodb.
-
basta dare istruzioni a mongodb per trovare il documento, cambiarlo; quindi, infine, dopo che mongodb è terminato, restituisci il risultato/errore come callback.
Nel tuo codice stai mescolando entrambi i metodi.
-
con user.save(), prima cerchi nel database con user.findOne e lo trascini sul server (nodejs), ora risiede nella memoria del tuo computer. Quindi puoi modificare manualmente i dati e infine salvarli su mongodb con user. salva()
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!' }); });
-
il secondo è usare User.findOneAndUpdate().. Questo è preferito, invece di user.findOne() quindi user.update(); perché quelli in pratica cercano due volte il database. prima per findOne() e cerca di nuovo per update()
Ad ogni modo, il secondo metodo è dire a mongodb di aggiornare i dati senza prima portarli sul server, quindi, solo dopo che mongodb avrà terminato la sua azione, riceverai il file aggiornato (o errore) come callback
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!' });
});