Database

db={"products":[{title:"a",productCategory:"category 1",shopId:ObjectId("5a934e000102030405000000"),date:new Date()},{title:"b",productCategory:"category 1",shopId:ObjectId("5a934e000102030405000001"),date:new Date()}],"shops":[{"_id":ObjectId("5a934e000102030405000000"),"name":"A"},{"_id":ObjectId("5a934e000102030405000001"),"name":"B"}]}

Query

db.products.aggregate([{$sort:{date:-1}},{$group:{_id:"$productCategory",products:{$push:"$$ROOT"}}},{$project:{products:{$slice:["$products",4]}}},{$lookup:{from:"shops",localField:"products.shopId",foreignField:"_id",as:"shop"}},{$project:{products:{$map:{input:"$products",in:{$mergeObjects:["$$this",{shop:{$arrayElemAt:[{$filter:{input:"$shop",as:"s",cond:{$eq:["$$s._id","$$this.shopId"]}}},0]}}]}}}}}])

Result