HellishCode
@HellishCode

MongoDB: как правильно сделать обновление данных в массиве, который находится внутри объекта?

Здравствуйте.
Пару дней как работаю с базами данных. Прошу помощи.
Задача:
Есть объект в базе вида:
{
  _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;


Естественно такой код далек от идеала, мне кажется, что обновления можно сделать одним методом или в одной функции. Подскажите пожалуйста, как можно улучшить мою запись?
  • Вопрос задан
  • 85 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы