Как обновить конкретное значение вложенного массива JSON в MongoDB?

Я пытаюсь обновить определенное поле с помощью mongoose в Node.js, это мои данные JSON:

{
    "farms": [
        {
            "extension": {
                "extension": 30,
                "measure": "Hectares"
            },
            "animals": [],
            "outs": [],
            "plans": [],
            "_id": "5ade19a531db34383b3e0bed",
            "name": "Farm 2",
            "updatedAt": "2018-04-23T17:36:37.680Z",
            "createdAt": "2018-04-23T17:36:37.680Z"
        },
        {
            "extension": {
                "extension": 30,
                "measure": "Hectares"
            },
            "animals": [],
            "outs": [],
            "plans": [],
            "_id": "5ade19c831db34383b3e0bef",
            "name": "Farm 3",
            "updatedAt": "2018-04-23T17:37:12.307Z",
            "createdAt": "2018-04-23T17:37:12.307Z"
        }
    ],
    "_id": "5ade19a5c47476697ec0d155",
    "username": "john99",
    "__v": 0,
    "createdAt": "2018-04-23T17:36:37.680Z",
    "updatedAt": "2018-04-23T17:37:12.307Z"
}

Я хочу обновить поле имени «Фермы 2». Это код, который я использую для обновления:

exports.update = (req, res) => { // fix me
  User.update (
    { username: 'john99',
      farms: {
        $elemMatch: { _id: "5ade19a531db34383b3e0bed"  } } 
    },
    { $set: {
       farms: { name: "Farm 99" } } } 
  )
    .then(farm => {
      if (!farm) {
        return res.status(404).send({
          message: "Farm not found with ID  " + req.params.idFarm
        });
      }
      res.send(farm);

    })
    .catch(err => {
      if (err.kind === "ObjectId") {
        return res.status(404).send({
          message: "Farm not Found with ID " + req.params.idFarm
        });
      }
      return res.status(500).send({
        message: "Error Updating User with ID " + req.params.idFarm
      });
    });
};

Это результат приведенного выше кода:

{
    "farms": [
        {
            "animals": [],
            "outs": [],
            "plans": [],
            "_id": "5ade1b9c7213483b1b38b60f",
            "name": "Farm 99"
        }
    ],
    "_id": "5ade19a5c47476697ec0d155",
    "username": "john99",
    "__v": 0,
    "createdAt": "2018-04-23T17:36:37.680Z",
    "updatedAt": "2018-04-23T17:45:00.822Z"
}

Как видите, когда я пытаюсь обновить поле имени, все фермы этого пользователя удаляются и оставляют ферму только с неполными данными (без поля расширения createdAt, updatedAt), Как это исправить?

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
371
1

Ответы 1

Это должно решить вашу проблему!

   User.update({'_id': ObjectId('5ade19a5c47476697ec0d155'), 
                'farms._id' : '5ade19a531db34383b3e0bed'}, 
                {$set: {'famrs.$.name': 'farm 99'}}
               ).then(farm =>{....});

Другие вопросы по теме