Здравствуйте.
Пару дней как работаю с базами данных. Прошу помощи.
Задача:
Есть объект в базе вида:
{
_id: '1',
title: 'Title'
done: false,
list: [
{ _id: '11' , title: 'Title', done: false},
{ _id: '22' , title: 'Title', done: true}
]
}
Пытаюсь сделать так, чтобы можно было обновить одновременно поле
done в объекте и внутри массива.
Из данных приходят айди объекта и айди объекта внутри массива, которые нужно оюновить.
Мой код:
const result = await db.todos.findOne({ _id: new ObjectId(todoId) });
if (result) {
// Сначала обновляем <i>done</i> внутри <i>list</i>
await db.todos.updateOne(
{ _id: new ObjectId(todoId) },
{ $set: {
list: result.list.map(l => ({
...l,
done: l._id.toString() === taskId.toString() ? !l.done : l.done
}))
}}
);
}
const result2 = await db.todos.findOne({ _id: new ObjectId(todoId) });
if (result2) {
// теперь обновляем <i>done</i> снаружи
await db.todos.findOneAndUpdate(
{ _id: new ObjectId(todoId) },
{ $set: {
done: result2.list.map(t => t.done).every(d => d === true)
}
}
);
}
return result;
Естественно такой код далек от идеала, мне кажется, что обновления можно сделать одним методом или в одной функции. Подскажите пожалуйста, как можно улучшить мою запись?