Как обновлять документ MongoDB только при изменении данных?

#javascript #node.js #mongodb #mongoose #crud

#javascript #node.js #mongodb #мангуст #crud

Вопрос:

Я создаю серверную часть приложения CRUD. В настоящее время у меня есть настройка почтового маршрута /diagrams/update:id , где я могу переопределить документ MongoDB основным текстом, который я отправляю через Postman.

Я могу успешно обновить документ, но когда я пытаюсь обновить только одни данные внутри документа, все остальное удаляется.

Я хочу, чтобы мой код 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. Вы передаете name , creator , и customer по каждому запросу? Моя первая мысль о том, почему это удаляет данные, была бы, если это не так, или вы передаете их как пустое или нулевое значение.

2. Object.assign(diagram, req.body)

3. Когда вы передаете just name , обновляется только имя. Когда вы передаете name , creator , и customer , да, оно передается как пустое и обновляется до пустого значения. Позже, когда я создаю интерфейс интерфейса, мне нужно, чтобы пользователь мог редактировать каждое поле, только если что-то изменилось. Означает ли это, что мне все равно нужно вводить name , creator , и customer каждый раз?

Ответ №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;
}