Как обновить документ MongoDB только при изменении данных? - PullRequest
0 голосов
/ 17 апреля 2019

Я создаю серверную часть приложения CRUD. В настоящее время у меня есть настройка маршрута POST для /diagrams/update:id, где я могу переопределить документ 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 голосов
/ 17 апреля 2019

Вы можете сделать что-то вроде этого.Просто передайте все значения для обновления в объекте.

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