总的来说,我对 Mongoose 还比较陌生。我正在构建我的博客应用程序,其后端基于 Node 和 MongoDB,我使用 Angular 作为前端。
我正在创建 Restful API,它应该允许用户单击帖子并更新它。但是,我不确定我在这里的做法是否正确。
这是我的帖子的架构:
const mongoose = require('mongoose');
// Schema Is ONly bluePrint
var postSchema = mongoose.Schema({
title: {type: String, required: true },
content: {type: String, required: true},
}, {timestamps: true});
module.exports = mongoose.model("Post", postSchema);
在我的 Angular 服务中,我有这个函数来帮助我将http请求发送到我的后端服务器,这个函数的id来自后端mongoDB,标题和内容来自页面上的表单
updatePost(id: string, title: string, content: string) {
console.log('start posts.service->updatePost()');
const post: Post = {
id: id,
title: title,
content: content
};
this._http.put(`http://localhost:3000/api/posts/${id}`, post)
.subscribe(res => console.log(res));
}
在我看来,至少有几种方法可以创建我的 API
方法 1(有效,但非常怀疑这是否是一个好的做法): 在这里,我将从 mongoDB 检索到的 id 通过我的 service.ts 文件传递回服务器,以避免“修改不可变字段 _id”错误
app.put("/api/posts/:id", (req,res)=>{
console.log('update api called:', req.params.id);
const post = new Post({
id: req.body.id,
title: req.body.title,
content: req.body.content
});
Post.updateOne({_id: req.params.id}, post).then( result=> {
console.log(result);
res.json({message:"Update successful!"});
});
});
方法 2 我认为这比方法 1 更强大,但我仍然认为它不是一个好的做法:
app.put("/api/posts/:id", (req, res)=> {
Post.findOne(
{_id:req.params.id},(err,post)=>{
if(err){
console.log('Post Not found!');
res.json({message:"Error",error:err});
}else{
console.log('Found post:',post);
post.title=req.body.title;
post.content=req.body.content;
post.save((err,p)=>{
if(err){
console.log('Save from update failed!');
res.json({message:"Error",error:err});
}else{
res.json({message:"update success",data:p});
}
})
}
}
);
});
我对各种意见持开放态度,希望能向 Mongoose 和 Restful 大师学习一些东西:)
最佳答案
在这种情况下选择findOneAndUpdate()
的理由简单来说如下:
- 您可以使用
findOneAndUpdate()
因为它会根据 过滤和排序标准。 - 在使用 mongoose 时,与
update()
相比,我们更喜欢使用此函数,因为它有一个选项{new: true}
并借助它我们可以获得更新的数据。 - 由于您的目的是更新单个文档,因此您可以使用
findOneAndUpdate()
。另一方面update()
应该是 用于批量修改。 - 由于
update()
始终返回修改后的文档,因此不会返回更新的文档,并且在处理此类场景时 您的我们总是返回更新的文档数据作为响应,因此我们 此处应使用findOneAndUpdate()
关于node.js - 寻找 Mongoose 更新一的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53798920/