Обновить одно поле конкретного обьекта в массива обьектов 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
}
);