Используя Mon go findOneAndUpdate, я пытаюсь обновить только некоторые поля в объекте из массива объектов.
Мой объект:
mainObject:{
_id: '123',
array:[
{title:'title' , name:'name', keep:'keep'},
{title:'title', keep:'keep'},
]
}
Я хочу изменить title
и name
для первого объекта в массиве и оставьте поле keep
без изменений. Это мой самый близкий подход с использованием позиционного оператора :
// here i set dynamic arguments for query update
// sometimes i need to update only one field, sometime i need to update more fields
// also, is there a better way to do this?
let title
let name
if (args.title) {
title = { title: args.title };
}
if (args.name) {
name= { name: args.name};
}
db.Test.findOneAndUpdate(
{ _id: args.id, 'mainObject.array.title': args.title},
{
$set: {
'mainObject.array.$[]': {
...title,
...name
}
}
}
)
эта проблема состоит в том, что он заменяет весь объект, в результате получается:
mainObject:{
array:[
{title:'changed' , name:'changed'}, //without keep... :(
{title:'title', keep:'keep'},
]
}
Должен ли я использовать рамки агрегации для этого?