首页 > 解决方案 > 在 Mongoose 中寻找更新的最佳方法

问题描述

总的来说,我对 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 的大师那里学到一些东西:)

标签: node.jsangularmongodbrestmongoose

解决方案


在这种情况下选择的理由findOneAndUpdate()简单来说如下:

  1. 您可以使用findOneAndUpdate()它根据过滤器和排序标准更新文档。
  2. 在大多数情况下使用猫鼬时,我们更喜欢使用此功能,update()因为它有一个选项{new: true},并且在它的帮助下我们可以获得更新的数据。
  3. 由于您在这里的目的是更新单个文档,因此您可以使用findOneAndUpdate(). 另一方面update()应该在批量修改的情况下使用。
  4. 由于update()始终返回已修改的文档,它不会返回更新的文档,并且在处理像您这样的场景时,我们总是返回更新的文档数据作为响应,因此我们应该findOneAndUpdate()在此处使用

推荐阅读