Обновить одно поле конкретного обьекта в массива обьектов MongooDB. mongoose

В базе данных лежит поле(achivement) с массивом обьектов. Нужно найти в массиве обьект у которого поле name соответствует значения для поиска и обновить поле currentPoint.
Код схемы mongoose:

const achive = new Schema(
   {
      achiveId: ObjectId,
      name: { type: String, required: true },
      finishedPoints: { type: Number, required: true },
      currentPoints: {
         type: Number,
         default: 0,
         set: function (v) {
            if (v >= this.finishedPoints) this.isFinished = true;
            return v;
         }
      },
      isFinished: { type: Boolean, default: false }
   },
   { _id: false }
);

const achivesSchema = new Schema({
   userId: ObjectId,
   achivement: [achive]
});

Код обновления :

export async function progressAchive(req, res) {
   const value = 3;
   try {
      const test = await Achives.updateOne(
         {
            userId: req.user._id,
            achivement: { $elemMatch: { name: req.params.nameAchive } }
         },
         { $set: { achivement: { currentPoints: value } } },

         { new: true }
      );
      res.json(test);
   } catch (e) {
      console.log(e);
   }
}

Вместо обновления оно удаляет все обьекты с массива и оставляет одни с полем currentPoint. Подскажите как обновить записа в бд?


Ответы (1 шт):

Автор решения: dragalur

Опция arrayFilters помогла обновить данные:

 await Achives.updateOne(
         {
            userId: req.user._id
         },
         { $set: { 'achivement.$[el].currentPoints': value } },
         {
            arrayFilters: [{ 'el.name': nameAchive }],
            new: true
         }
      );
→ Ссылка