Database

[{"_id":1,"vendorId":"Vendor1","orders":[{"orderNumber":"order1","data":"data1"},{"orderNumber":"order2","data":"data2"}]},{"_id":2,"vendorId":"Vendor1","orders":[]},{"_id":3,"vendorId":"Vendor1"},{"_id":4,"vendorId":"Vendor1","orders":[{"orderNumber":"order1","data":"data1"}]}]

Query

db.collection.update({/** find doc with correct "vendorId"*/"vendorId":"Vendor1"},/** use pipeline*/[{/** rebuild "orders"*/"$set":{"orders":{"$let":{"vars":{/** from input params*/"orderParam":{"orderNumber":"order2","data":"NEW_DATA_FROM_INPUT"}},"in":{"$cond":[/** does "orders.orderNumber" exist and is array?*/{"$eq":[{"$type":"$orders.orderNumber"},"array"]},/** yes, "orders.orderNumber" exists and is array*/{"$cond":[/** does an order need rewriten "data"?*/{"$in":["order2","$orders.orderNumber"]},/** yes, rewrite specific order, keep the rest*/{"$map":{"input":"$orders","as":"order","in":{"$cond":[/** is this the order?*/{"$eq":["$$order.orderNumber","$$orderParam.orderNumber"]},/** yes, rewrite this order*/{"$mergeObjects":["$$order",{"data":"$$orderParam.data"}]},/** not the order, so keep it*/"$$order"]}}},/** no, order is not there, so just append it*/{"$concatArrays":["$orders",["$$orderParam"]]}]},/** nobody home, create it*/["$$orderParam"]]}}}}}],{"multi":true})

Result