Mon goose - заменить все элементы массива - PullRequest
2 голосов
/ 26 апреля 2020

Я хочу заменить все элементы массива в «ценах», указанных ниже:

{
 "name": "My customer name"
 "taxCode":123456
 "prices": 
         [
           {
             "name": "Chocolate",
             "unitPrice": 10
           },
           {
             "name": "Cookie",
             "unitPrice": 9
           }
         ]
}

JSON, который используется для изменения «цен»:

{
 "prices": 
          [
             {
              "name": "Chocolate1", 
              "unitPrice": 10
             },
             {
              "name": "Candy",
              "unitPrice": 5
             }
           ]
}

И вот мой код для замены массива 'цен'

router.route('/:obj/:id')
  .put((req, res) => {
    const PObj  = require('../models/customer');
    PObj.findById(req.params.id, (err, doc) => {
      if (err) { 
        console.log('Lookup error: ' + err);
        res.status(500).send('Error');
      } else if (doc) {
        doc.update({$set: req.body}, (err, task) => {
          res.status(200).json(task);
        });     } else {
        res.status(404).send('Something is wrong');
      }
    });
  });

после выполнения кода, но без каких-либо изменений в базе данных Mon go. Пожалуйста, помогите мне исправить мой код. Поблагодарить!

1 Ответ

1 голос
/ 26 апреля 2020

Если ваш req.body распечатывает этот массив цен, тогда он должен быть req.body.prices, а не извлекать документ и обновлять его - что является двусторонним процессом, вы можете попробовать это:

router.route("/:obj/:id").put((req, res) => {
  const PObj = require("../models/customer");
  PObj.findByIdAndUpdate(
    req.params.id, /** this 'req.params.id' has to be `_id` value of doc in string format */
    /** internally mongoose will send this as { $set: { prices: req.body.prices }} which will replace `prices` array will new array,
     *  Just in case if you wanted to push new values, have to manually do { $push: { prices: req.body.prices }} each object */
    { prices: req.body.prices },
    { new: true }, /** returns updated doc, this option is not needed if you don't need doc - by default it returns old doc */
    (err, doc) => {
      if (err) {
        console.log("Lookup error: " + err);
        res.status(500).send("Error");
      } else if (doc) { 
        res.status(200).json(task);
      } else { /** `doc` value will be null if no doc is not found for given id */
        res.status(404).send("Something is wrong");
      }
    }
  );
});

Ссылка: .findByIdAndUpdate ()

...