Database
db={"contracts":[{"bid":1,"type":"A","name":"N1"},{"bid":1,"type":"B","name":"N2"},{"bid":1,"type":"C","name":"N3"}],"businesses":[{"id":1,"contract_settings":{"A":{"price":100},"B":{"price":200},"default":"A"}}]}
Query
db.contracts.aggregate([{$lookup:{from:"businesses",localField:"bid",foreignField:"id",as:"businesses"}},{$unwind:"$businesses"/**i'm assuming there's always 1.*/},{$addFields:{matchedPrice:{$reduce:{input:{$filter:{input:{$objectToArray:"$businesses.contract_settings"},as:"setting",cond:{$eq:["$$setting.k","$type"]}}},initialValue:null,in:"$$this.v.price"}}}},{$addFields:{price:{$ifNull:["$matchedPrice",{$reduce:{input:{$filter:{input:{$objectToArray:"$businesses.contract_settings"},as:"setting",cond:{$eq:["$$setting.k","$businesses.contract_settings.default"]}}},initialValue:null,in:"$$this.v.price"}}]}}},{$project:{price:1,bid:1,type:1,name:1}}])