Existem 2 maneiras de atualizar documentos no mongodb:
-
encontre o documento, traga-o para o servidor, altere-o e salve-o novamente no mongodb.
-
apenas dê instruções ao mongodb para encontrar o documento, altere-o; então, finalmente, depois que o mongodb for concluído, retorne o resultado/erro como retorno de chamada.
No seu código, você está misturando os dois métodos.
-
com user.save(), primeiro você pesquisa o banco de dados com user.findOne, e o puxa para server(nodejs), agora ele vive na memória do seu computador. Então você pode alterar manualmente os dados e finalmente salvá-los no mongodb com user. Salve ()
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!' }); });
-
a segunda é usar User.findOneAndUpdate().. Isso é preferível, em vez de user.findOne() e depois user.update(); porque aqueles basicamente pesquisam o banco de dados duas vezes. primeiro para findOne() e pesquise novamente para atualizar()
De qualquer forma, o segundo método está dizendo ao mongodb para atualizar os dados sem primeiro trazer para o servidor, em seguida, somente após o mongodb terminar com sua ação, você receberá o arquivo atualizado (ou erro) como retorno de chamada
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!' });
});