Как найти OndAndUpdate элемент массива?

Это заявление об обновлении:

const cart = await Cart.findOneAndUpdate({
        userId: userId,
        'items._id': itemId,
        'items.product': productId,
        'items.size': size,  
        'items.color': color, 
    }, {
        $set: {
            'items.$.quantity': quantity
        }
    }, {
        new: true
    }).populate({
        path: 'items.product',
        model: 'Product'
    })

Это новая величина, которая будет применена к массиву:

newQuantity {
  itemId: '625065c99edbfad52ac3afce',  
  productId: '6205a4565c0caba6fb39cd5d',
  size: '3',
  quantity: '3',
  color: 'blue2'
}

Это данные в базе данных, первый элемент массива обновляется новым количеством, а не вторым элементом, который соответствует критериям запроса, показанным выше.

{
  "_id": {
    "$oid": "623a1f208ea52c030dc331a5"
  },
  "userId": {
    "$oid": "623a1f208ea52c030dc331a3"
  },
  "items": [
    {
      "quantity": 2,
      "product": {
        "$oid": "6205a4565c0caba6fb39cd5d"
      },
      "size": "3",
      "color": "blue1",
      "prodImage": "mom-jeans-3.1.png",
      "_id": {
        "$oid": "625065c69edbfad52ac3afc2"
      }
    },
    {
      "quantity": 1,
      "product": {
        "$oid": "6205a4565c0caba6fb39cd5d"
      },
      "size": "3",
      "color": "blue2",
      "prodImage": "mom-jeans-5.1.png",
      "_id": {
        "$oid": "625065c99edbfad52ac3afce"
      }
    },
    {
      "quantity": 1,
      "product": {
        "$oid": "6205a4565c0caba6fb39cd5d"
      },
      "size": "3",
      "color": "blue3",
      "prodImage": "mom-jeans-4.1.png",
      "_id": {
        "$oid": "625065cc9edbfad52ac3afdc"
      }
    }
  ],
      "__v": 0
    }
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
22
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Оператор '$' обновляет только первый найденный элемент.

Вы должны использовать оператор $[]:

const cart = await Cart.findOneAndUpdate({
    userId: userId,
    'items._id': itemId,
    'items.product': productId,
    'items.size': size,  
    'items.color': color, 
}, {
    $set: {
        'items.$[].quantity': quantity
    }
}, {
    new: true
}).populate({
    path: 'items.product',
    model: 'Product'
})

Попробуй это.

Ваш подход обновляет количество каждого элемента в массиве.

koque 08.04.2022 22:27
Ответ принят как подходящий

Вы можете использовать фильтры массива для получения желаемого результата:

Запрос userId в поиск будет фильтровать все документы, а фильтр массива найдет объект в массиве, который соответствует вашему условию.

db.collection.update({
  "userId": userId
},
{
  "$set": {
    "items.$[item].quantity": quantity
  }
},
{
  "arrayFilters": [
    {
      "item._id": itemId,
      "item.product": productId,
      "item.size": size,
      "item.color": color
    }
  ]
})

Пример здесь

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