【问题标题】:How to update MongoDB document only when data changed?如何仅在数据更改时更新 MongoDB 文档?
【发布时间】:2019-04-16 21:03:36
【问题描述】:

我正在构建一个 CRUD 应用程序的后端。我目前有一个/diagrams/update:id 的 POST 路由设置,我可以在其中使用通过 Postman 发送的正文覆盖 MongoDB 文档。

我可以成功更新文档,但是当我尝试只更新文档中的一个数据时,其他所有数据都会被删除。

我希望我的代码 1) 检测我要更改的内容是否与数据库中的数据不同,2) 仅当不同时,更新记录,3) 如果没有更改,则不更新并将当前数据保存在数据库中。

我试图做类似的事情

if (diagram.name !== req.body.name) {
diagram.name = req.body.name}

但这意味着我必须为每一个更改编写该逻辑。

server.js

router.route('/diagrams/update/:id').post((req, res)=> {
  mySchema.findById(req.params.id, (err, diagram) => {
    if (!diagram)
      return next(new Error('Could not load doc!'))
    else {

// I tried something like
// if (diagram.name !== req.body.name) {
// diagram.name = req.body.name}
// but that only works one at a time

      diagram.name = req.body.name;
      diagram.creator = req.body.creator;
      diagram.customer = req.body.customer;

      diagram.save().then( diagram => {
        res.json('Update done!')
      }).catch(err => {
        res.status(400).send('Update faileddddd')
      })
    }
  })
})

MySchema.js

const mongoose = require( 'mongoose');
const Schema = mongoose.Schema;

let mySchema = new Schema({

    name: {
        type: String
    },
    creator: {
        type: String
    },
    customer: {
        type: String
    }
}, {collection: `fivo`})

【问题讨论】:

  • 您是否在每个请求中都传递了namecreatorcustomer?我首先想到的是为什么要删除数据,如果您不是,或者您将它们作为空白或空值传递。
  • Object.assign(diagram, req.body)
  • 当您只传入name 时,只会更新名称。当您传入namecreatorcustomer 时,是的,它作为空白传递并更新为空白值。稍后当我构建前端界面时,我需要用户只有在发生变化时才能编辑每个字段。这是否意味着我仍然必须每次都传递namecreatorcustomer

标签: javascript node.js mongodb mongoose crud


【解决方案1】:

你可以做这样的事情。只需在对象中传递所有要更新的值。

let update = async (userId, properties) => {
  let user = await Users.findOne({ _id: userId });

  // Update all properties.
  for(property in properties) {
    user[property] = properties[property];
  }

  user = await user.save();
  return user;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2015-01-02
    • 2017-05-28
    • 2018-12-29
    • 2014-09-09
    • 1970-01-01
    • 2017-08-15
    相关资源
    最近更新 更多