Database
db={"recipes":[{"id":1,"name":"flatbread pizza","ingredients":{"1010":1,"1020":2,"1030":200}},{"id":2,"name":"cheese sandwich","ingredients":{"1040":1,"1050":2}}],"ingredients":[{"id":1010,"name":"flatbread","unit":"pieces"},{"id":1020,"name":"garlic","unit":"clove"},{"id":1030,"name":"tomato sauce","unit":"ml"},{"id":1040,"name":"bread","unit":"slices"},{"id":1050,"name":"cheese","unit":"slices"}]}
Query
db.recipes.aggregate([{"$addFields":{ingredientsParts:{"$objectToArray":"$ingredients"}}},{$unwind:"$ingredientsParts"},{"$group":{_id:"$id",name:{$first:"$name"},ingredientsParts:{$push:{v:"$ingredientsParts.v",id:{$toInt:"$ingredientsParts.k"}}}}},{"$lookup":{"from":"ingredients","localField":"ingredientsParts.id","foreignField":"id","as":"ingredients"}},{$unwind:"$ingredients"},{"$addFields":{"ingredientsPart":{"$filter":{input:"$ingredientsParts",as:"item",cond:{$eq:["$$item.id","$ingredients.id"]}}}}},{$project:{ingredients:1,ingredientsPart:{"$arrayElemAt":["$ingredientsPart",0]},name:1}},{"$addFields":{units:{k:"$ingredients.name",v:{"$concat":[{$toString:"$ingredientsPart.v"}," ","$ingredients.unit"]}}}},{$group:{_id:"$_id",name:{$first:"$name"},units:{$push:"$units"}}},{"$addFields":{"data":{"$arrayToObject":"$units"}}},{"$addFields":{"data.id":"$_id","data.name":"$name"}},{"$replaceRoot":{"newRoot":"$data"}}])