仅在数据更改时如何更新MongoDB文档?

时间:2019-04-16 21:03:36

标签: javascript node.js mongodb mongoose crud

我正在构建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`})

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作。只需将所有要更新的值传递到对象中即可。

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;
}