апсерт он про добавление нового документа, если вдруг не нашелся искомый. В вашем случае можно попробовать на update with aggregation сделать. Полез реализовывать и прям закопался, проще уж вытащить док, изменит ьи полностью новый массив записать
для истории
db.getCollection('t_1').updateOne({
product_id: "TEST_PRODUCT"
},
[{
$set: {
prices: {
$cond: {
if: {
$gt: [{
$reduce: {
input: "$prices",
initialValue: 0,
in: { $add:
[
"$$value",
{
$cond: {
if: {$and: [{
$eq: ["$$this.country", "UK"]
}, {
$eq: ["$$this.currency", "GBP"]
}
]},
then: 1,
else: 0
}
}
]}
}
},
0
]
},
then: {
$map: {
input: "$prices",
in: {
$setField: {
field: "value",
input: "$$this",
value: {
$cond: {
if: {
$and: [{
$eq: ["$$this.country", "UK"]
}, {
$eq: ["$$this.currency", "GBP"]
}
]
},
then: 150,
else: "$$this.value"
}
}
}
}
}
},
else: {
$concatArrays: [
"$prices",
[{
"country": "UK",
"currency": "GBP",
"value": 150
}]
]
}
}
}
}
}
]);
для дока вида:
{
"product_id" : "TEST_PRODUCT",
"prices" : [ {
"country" : "RU",
"currency" : "RUB",
"value" : 120
},{
"country" : "UK",
"currency" : "EUR",
"value" : 140
}]
}