Database

[{"_id":"curveId exists and is larger","curveId":12,"values":[1,2,3,7,8,9]},{"_id":"curveId exists and values is exact","curveId":12,"values":[1,2,3,4]},{"_id":"curveId exists but values is short by 1","curveId":12,"values":[1,2,3]},{"_id":"curveId exists but values is short by 2","curveId":12,"values":[1,2]},{"_id":"curveId exists but values is empty","curveId":12,"values":[]},{"_id":"curveId exists but values is null","curveId":12,"values":null},{"_id":"curveId exists but values does not exist","curveId":12},{"_id":"curveId 99 doesn't exist"}]

Query

db.collection.update({curveId:12},[{$set:{values:{$let:{vars:{/** index & new value to set*/idx:0,new_val:1000},in:{$cond:{if:{$and:[{$isArray:"$values"},{$lte:["$$idx",{$size:"$values"}]}/** "lte" is correct here*/]},then:{$concatArrays:[{$slice:["$values","$$idx"]},["$$new_val"],{$slice:["$values",{$add:["$$idx",1]},{$add:[{$size:"$values"},1]}]}]},else:{$let:{vars:{vals_nulls:{$map:{input:{$zip:{inputs:[{$ifNull:["$values",[]]},{$range:[0,"$$idx"]}],useLongestLength:true}},in:{$first:"$$this"}}}},in:{$concatArrays:[{$slice:["$$vals_nulls","$$idx"]},["$$new_val"],{$slice:["$$vals_nulls",{$add:["$$idx",1]},{$add:[{$size:"$$vals_nulls"},1]}]}]}}}}}}}}}],{upsert:true,multi:true})

Result