Database
[{cantidad:23,historial:{entradas:[{cantidad:5},{cantidad:10},{cantidad:8}],salidas:[]}}]
Query
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",}}])