[英]Update multiple properties in array of objects with MongoDb
我有一個這樣的對象數組:
vale {
cantidad: 23
historial {
entradas:[
{cantidad: 5},
{cantidad:10},
{cantidad:8}
]
salidas:[]
}
}
我想做一個 mongo 查詢,給定某個“cantidad”,它將從“entradas 數組”中減去它
例如,如果我想在最后減去 7,object 將如下所示:
vale {
cantidad: 16
historial {
entradas:[
{cantidad: 0},
{cantidad: 8},
{cantidad:8}
]
salidas:[]
}
}
所以現在 cantidad 是 16 並且“entradas”數組將第一個放在“0”中,然后將剩余的值減去下一個,如果我會減去 17,那么 entradas 數組應該如下所示:
entradas:[
{cantidad: 0},
{cantidad: 0},
{cantidad:6}
]
The process should be like:
value = 17
(entradas[0] - value < 0) --> true
then
value -= entradas[0]; entradas[0] = 0 --> value is now 12
then
(entradas[1] - value < 0) --> true
then
value -= entradas[1]; entradas[1] = 0 --> value is now 2
then
(entradas[2] - value < 0) --> false
then
entradas[2] -= value --> value is now 0
我正在嘗試學習 mongoDb 的高級查詢,但老實說,我不知道如何做到這一點,或者在 MongoDb 查詢中是否可能。 “cantidad”和所有“entradas.cantidad”的總和將始終相同,我確保在進行此更新之前驗證該值小於總量。
希望有人可以幫助我:)
這是使用聚合管道的一種方法,盡管您最好先獲取文檔,然后在應用程序中修改它,然后再更新它。 如果您只想通過 MongoDB 執行此操作,請嘗試以下操作:
db.collection.aggregate([
{
"$match": {
cantidad: 23
}
},
{
"$addFields": {
"newDoc": {
"$function": {
"body": "function(data, value) { data.cantidad = data.cantidad - value; data.historial.entradas = data.historial.entradas.map(entrada => { let copy = entrada.cantidad; entrada.cantidad = Math.max(entrada.cantidad-value, 0); value = Math.max(value - copy, 0); return entrada; }); return data; }",
"args": [
"$$ROOT",
7
],
"lang": "js"
}
}
}
},
{
"$replaceRoot": {
"newRoot": "$newDoc"
}
},
{
"$merge": {
"into": "collection",
"on": "_id",
"whenMatched": "replace",
}
}
])
這是操場鏈接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.