Условный оператор в мангусте

#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 }},  }  }  ])