Có 2 cách để cập nhật tài liệu trong mongodb:
-
tìm tài liệu, đưa nó đến máy chủ, thay đổi nó, sau đó lưu nó trở lại mongodb.
-
chỉ cần đưa ra hướng dẫn cho mongodb để tìm tài liệu, thay đổi nó; rồi cuối cùng sau khi mongodb hoàn tất, hãy trả về kết quả / lỗi dưới dạng gọi lại.
Trong mã của bạn, bạn đang kết hợp cả hai phương pháp.
-
với user.save (), đầu tiên bạn tìm kiếm cơ sở dữ liệu với user.findOne và kéo nó đến máy chủ (nodejs), bây giờ nó nằm trong bộ nhớ máy tính của bạn. sau đó bạn có thể thay đổi dữ liệu theo cách thủ công và cuối cùng lưu nó vào mongodb với người dùng. 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!' }); });
-
cách thứ hai là sử dụng User.findOneAndUpdate () .. Điều này được ưu tiên, thay vì user.findOne () thì user.update (); bởi vì những người này về cơ bản tìm kiếm cơ sở dữ liệu hai lần. đầu tiên để findOne () và tìm kiếm lại để cập nhật ()
Dù sao, phương pháp thứ hai là yêu cầu mongodb cập nhật dữ liệu mà không cần đưa đến máy chủ trước, Tiếp theo, chỉ sau khi mongodb hoàn thành hành động của nó, bạn sẽ nhận được tệp cập nhật (hoặc lỗi) dưới dạng gọi lại
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!' });
});