Это заявление об обновлении:
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
}
Оператор '$' обновляет только первый найденный элемент.
Вы должны использовать оператор $[]:
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'
})
Попробуй это.
Вы можете использовать фильтры массива для получения желаемого результата:
Запрос userId
в поиск будет фильтровать все документы, а фильтр массива найдет объект в массиве, который соответствует вашему условию.
db.collection.update({
"userId": userId
},
{
"$set": {
"items.$[item].quantity": quantity
}
},
{
"arrayFilters": [
{
"item._id": itemId,
"item.product": productId,
"item.size": size,
"item.color": color
}
]
})
Пример здесь
Ваш подход обновляет количество каждого элемента в массиве.