Как обновить объект внутри массива документов Mongo (по определенному индексу)

Я хочу, чтобы пользователь проверял, «приобрел» ли он продуктовый товар, и обновлял базу данных.

Говоря более конкретно, когда пользователь устанавливает флажок, я хочу переключить логическое свойство acquired в объекте ингредиента. Ингредиенты хранятся в массиве в документе GroceryList:

Вот схема для списка продуктов

const GroceryListSchema = mongoose.Schema({
  createdAt         : { type: Date, default: Date.now },
  updatedAt         : { type: Date },
  ingredients       : { type: Array },
  recipes           : { type: Array },
  user              : { type: mongoose.Schema.Types.ObjectId, ref: 'UserSchema', required: true },
}

Ингредиент выглядит так:

{ quantity: '3',
  unit: null,
  ingredient: 'zucchinis, chopped',
  minQty: '3',
  maxQty: '3',
  acquired: false }

Я просмотрел множество похожих вопросов, документацию Mongoose и документацию MongoDB, и я пробовал массу разных версий, но я в тупике.

Внешний интерфейс:

function toggleIngredient(elmt, groceryListId, ingrIdx) {
  $.post('/cart/grocery-list/toggleIngredient', {
    groceryListId,
    ingrIdx,
    newValue: elmt.checked, // if checkbox was checked before toggling it
  })
    .then((res) => {
      console.info(res);
    })
    .catch((err) => {
      console.info(err);
    });
}

Серверная часть:

  app.post('/cart/grocery-list/toggleIngredient', (req, res, next) => {
    const { groceryListId, ingrIdx, newValue } = req.body;

    GroceryListSchema.findById(groceryListId, (err, groceryList) => {
      if (err) return next(err);

      // if was unchecked, change to checked & vice-versa
      groceryList.ingredients[ingrIdx].acquired = newValue;

      // save updated grocery list
      groceryList.save().then((updatedList) => {
        console.info(updatedList.ingredients);
      }).catch(error => next(error));
    });
  });

РЕЗУЛЬТАТЫ / ПРОБЛЕМА: Когда я запускаю приведенный выше код, я успешно вижу, что свойство acquired 1 ингредиента переключается с false->true в обратном вызове.

console.info(updatedList.ingredients);

Однако в следующий раз, когда я достану список продуктов, тот же самый ингредиент acquired = false. Это наводит меня на мысль, что документ GroceryList на самом деле не обновляется в базе данных. Как это исправить?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

мангуст не может отслеживать изменения внутри массива, если вы изменяете элемент массива напрямую, используя его индекс

попробуйте добавить эту строку перед сохранением

groceryList.markModified(`ingredients.${ingrIdx}.acquired`);

Другие вопросы по теме