在 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 中寻找更新的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

将二维数组保存到 MongoDb 的最佳方法

Egg中使用egg-mongoose和常用的Mongoose 方法

Egg中使用egg-mongoose和常用的Mongoose 方法

MongoDB / Mongoose 单元测试 - 最佳实践? [关闭]

Mongoose - 在模式中存储 Set 的最佳方法

使用 JWT (Node.js + mongoose) 在 REST API 中管理用户权限的最佳方法