#mongodb #mongoose #conditional-operator
#mongodb #мангуст #условный оператор
Вопрос:
Я пытаюсь условно выполнить два разных оператора мангуста, но он просто не возвращает ошибок и не работает для обновления документа.
Моя Схема:
const CartSchema: Schemalt;Documentlt;ICartgt;gt; = new Schema({ clientID: { type: String, required: true }, sourceID: { type: String, required: true }, items: { type: Array }, source: { type: String, required: true }, }, { collection: "carts", timestamps: true });
То, как я пытаюсь это реализовать:
await CartModel.findOneAndUpdate( { sourceID: clientID, 'items.id': Types.ObjectId(itemID) }, { $cond: { if: { $eq: 1, }, then: { $pull: { 'items.$.id': Types.ObjectId(itemID) }}, else: { $inc: { 'items.$.amount': -1 }}, } }, { new: true } ).lean({ virtuals: true })
И я также попытался задать такой вопрос: { sourceID: clientID }
но это не помогло. Я подумал, что, может быть, я не смог найти элемент, и он просто бесшумно прошел.
Основная идея того , что я собираюсь сделать, заключается в том, чтобы выполнить условный запрос мангуста, в котором я либо удалю объект из массива, если текущее значение в поле amount
равно 1
, либо уменьшу значение до -1
.
Комментарии:
1. вы не можете смешивать операторы обновления с агрегатными операторами, если вы хотите что-то, что вы не можете сделать с обычными операторами обновления, используйте обновление только с конвейерными и агрегатными операторами. Если вам нужно
$cond
затем использовать[...]
для обновления конвейера, найдите метод, который принимает конвейеры в качестве аргументов в мангусте, или отправьте команду запуска(команду обновления), заменитеpull
на$filter
и inc на $add 1. См. Документацию об обновлениях конвейера
Ответ №1:
По-видимому, $cond
оператор работает только в aggregation
рамках, но на моем уровне Atlas я не могу проверить, правильно ли работает запрос, но я полагаю, что он должен выглядеть примерно так:
await CartModel.aggregate([ { $match: { sourceID: clientID, 'items.id': Types.ObjectId(itemID) } }, { $cond: { if: { $eq: 1, }, then: { $pull: { 'items.$.id': Types.ObjectId(itemID) }}, else: { $inc: { 'items.$.amount': -1 }}, } } ])