node.js - 寻找 Mongoose 更新一的最佳方法

标签 node.js angular mongodb rest 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);

在我的 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()的理由简单来说如下:

  1. 您可以使用 findOneAndUpdate() 因为它会根据 过滤和排序标准。
  2. 在使用 mongoose 时,与 update() 相比,我们更喜欢使用此函数,因为它有一个选项 {new: true} 并借助它我们可以获得更新的数据。
  3. 由于您的目的是更新单个文档,因此您可以使用 findOneAndUpdate()。另一方面 update() 应该是 用于批量修改。
  4. 由于 update() 始终返回修改后的文档,因此不会返回更新的文档,并且在处理此类场景时 您的我们总是返回更新的文档数据作为响应,因此我们 此处应使用 findOneAndUpdate()

关于node.js - 寻找 Mongoose 更新一的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53798920/

相关文章:

javascript - 使用 Hapi 和异步的 API - 如何清空数组/在 "reply"之后或在每个新的 "get"处立即执行某些操作?

node.js - 在pug(jade)内部动态创建元素

css - Angular:如何更改子元素高度

node.js - 如何查看 Sequelize.js 生成的 SQL?

angular - 属性 'loading' 在类型 'Observable<GridDataResult> --aot 上不存在(见编辑)

angular cli 排除 `ng test --code-coverage` 的文件/目录

mongodb - 针对 MongoDB 中的副本集运行脚本

mongodb - Mongodb-3.4 的最佳开源 gui 工具

node.js - 将 Mongoose 连接传递给模块

javascript - 使用 socket.IO 时如何让 console.log 在浏览器中工作?