Как обновить массив с его индексным номером в Mongoose

#node.js #mongodb #mongoose

#node.js #mongodb #mongoose

Вопрос:

в моей пользовательской модели есть корзина с элементами (массив). Я хочу проверить, достаточно ли запасов для каждого товара в его корзине, и если нет, обновить количество товара в его корзине до доступного запаса (заполняется ProductID).

    }                   
})
  

Ну, ‘cart.items [i].quantity’ было бы слишком просто, это не работает: D

Пользователь: [![введите описание изображения здесь][1]][1]

Продукт: [![введите описание изображения здесь][2]][2]

Комментарии:

1. Как выглядит документ? Можете опубликовать несколько примеров документов.

2. Добавлены скриншоты (да, я знаю, что ProductID не совпадает, это пример)

Ответ №1:

Это код, который вы предоставили.

 user.cart.items.forEach((item, i) => {
   if (item.quantity > item.productId.stock) {
      User.findByIdAndUpdate(user._id, {'cart.items[i].quantity': item.productId.stock})
   }                   
})
  

Из приведенного выше кода я вижу, что у нас есть productId элемент, который нужно обновить. Так зачем использовать индекс, когда у нас есть productId ? В любом случае я создал образец документа на основе ваших скриншотов и создал запрос, который обновляет его на quantity основе productId . Вы можете перейти по ссылке mongo playground, запустить запрос и внести изменения в соответствии с вашими потребностями.

Попробуйте этот запрос-

 db.collection.update({
  _id: 1
},
{
  "$set": {
    "cart.items.$[element].quantity": 2   /**where 2=item.productId.stock*/
  }
},
{
  arrayFilters: [
    {
      "element.productId": 100
    }
  ]
})
  

Вот игровая площадка Mongo

Редактировать :

Если вы все еще хотите сделать это с помощью index.

 db.collection.update({
  _id: 1
},
{
  "$set": {
    "cart.items.1.quantity": 2/**where 1 is index and 2=item.productId.stock*/
    
  }
})
  

Вот игровая площадка

Комментарии:

1. Спасибо за поддержку. Я также обновил ответ для индексного запроса.