在 Mongoose 中寻找更新的最佳方法
Posted
技术标签:
【中文标题】在 Mongoose 中寻找更新的最佳方法【英文标题】:Looking for Best Approach For update one in Mongoose 【发布时间】:2019-05-16 20:35:00 【问题描述】:总的来说,我对 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);
在我的角度服务中,我有这个函数可以帮助我将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(有效,但高度怀疑这是否是好的做法): 在这里,我通过我的 service.ts 文件将从 mongoDB 检索到的 id 传递回服务器,以避免“修改不可变字段 _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的大师学习一些东西:)
【问题讨论】:
【参考方案1】:在这种情况下选择findOneAndUpdate()
的理由简单来说如下:
-
您可以使用
findOneAndUpdate()
,因为它会根据
过滤和排序标准。
虽然主要使用 mongoose,但与 update()
相比,我们更喜欢使用此功能,因为它有一个选项 new:
true
,借助它我们可以获得更新的数据。
您的目的是更新单个文档,以便您可以使用findOneAndUpdate()
。另一方面,update()
应该是
用于批量修改。
由于update()
总是返回修改的文档,它不会返回更新的文档,并且在处理这样的场景时
您的我们总是返回更新的文档数据作为响应,所以我们
应该在这里使用findOneAndUpdate()
【讨论】:
以上是关于在 Mongoose 中寻找更新的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
Egg中使用egg-mongoose和常用的Mongoose 方法
Egg中使用egg-mongoose和常用的Mongoose 方法