Изменить одно значение вложенного документа в mongodb - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть модель под названием Notes. Он содержит поддокумент requests, в котором содержатся различные документы со значениями userId, reqType, accepted (по умолчанию false) и noteId отправителя, запроса и примечания соответственно. Когда пользователь выбирает определенный маршрут, я хочу сохранить все данные в качестве своих предыдущих значений, просто обновив поле accepted до true.

Приведенный ниже код не приводит к изменению данных или другая итерация приводит к удалению всех данных, кроме поля accepted, и изменению его на true.

Как мне это сделать?

const noteSchema = new mongoose.Schema(
    requests: [
      {
        userId: mongoose.Schema.ObjectId,
        noteId: mongoose.Schema.ObjectId,
        reqType: String,
        accepted: {
          type: Boolean,
          default: false,
        },
      },
    ],
  }
)

const Note = mongoose.model('Note', noteSchema)

const note = await Note.findById(req.body.noteId)

await note.updateOne({
      requests: {
        $elemMatch: {
          userId: req.body.userId,
          reqType: req.body.reqType,
          noteId: req.body.noteId,
        },
        $set: { "requests.$.accepted": true },
      }, 
    })

1 Ответ

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

Вам не нужно извлекать документ и затем обновлять его. Просто обновите это. Используйте это:

await Note.updateOne(
    {
        "requests.userId": req.body.userId,
        "requests.reqType": req.body.reqType,
        "requests.noteId": req.body.noteId
    },
    {
        $set:
        {
           "requests.$.accepted":true
        }
    }
);

Я проверил, все заработало.

С первой частью mon goose найдет документ, с $set он будет обновлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...