Я хочу, чтобы пользователь проверял, «приобрел» ли он продуктовый товар, и обновлял базу данных.
Говоря более конкретно, когда пользователь устанавливает флажок, я хочу переключить логическое свойство 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
на самом деле не обновляется в базе данных. Как это исправить?
мангуст не может отслеживать изменения внутри массива, если вы изменяете элемент массива напрямую, используя его индекс
попробуйте добавить эту строку перед сохранением
groceryList.markModified(`ingredients.${ingrIdx}.acquired`);