mongodbのドキュメントを更新する方法は2つあります:
-
ドキュメントを見つけてサーバーに持ち込み、変更してから、mongodbに保存し直します。
-
mongodbにドキュメントを見つけて変更するように指示するだけです。最後に、mongodbが完了した後、結果/エラーをコールバックとして返します。
コードでは、両方の方法を組み合わせています。
-
user.save()を使用して、最初にuser.findOneでデータベースを検索し、それをserver(nodejs)にプルします。これで、データベースはコンピューターのメモリに保存されます。次に、データを手動で変更し、最後にuserを使用してmongodbに保存できます。 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!' }); });
-
2つ目は、User.findOneAndUpdate()を使用することです。これは、user.findOne()、次にuser.update()の代わりに使用することをお勧めします。基本的にデータベースを2回検索するからです。最初にfindOne()を検索し、もう一度検索してupdate()
とにかく、2番目の方法は、最初にサーバーに移動せずにデータを更新するようにmongodbに指示することです。次に、mongodbがアクションを終了した後にのみ、更新されたファイル(またはエラー)をコールバックとして受け取ります
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!' });
});