Database

[{"shopId":ObjectId("6043adb043707c034d5363b6"),/** <- this is mongodb id*/"shopItems":[{itemId:1,/** mongodb id*/itemCount:5,colorId:"colorId1"},{itemId:2,/** mongodb id*/itemCount:3,colorId:"colorId2"},{itemId:777,/** mongodb id*/itemCount:999,colorId:"colorId2"},{itemId:777,/** mongodb id*/itemCount:111,colorId:"myColor"}]},{"shopId":ObjectId("604c776763c302032e610347"),/**<- this is mongodb id*/"shopItems":[{itemId:2,/** mongodb id*/itemCount:5,colorId:"colorId1"},{itemId:3,/** mongodb id*/itemCount:3,colorId:"colorId2"}]},{"shopId":ObjectId("60f58c8117514c032774b184"),/** <- this is mongodb id*/"shopItems":[{itemId:3,/** mongodb id*/itemCount:5,colorId:"colorId1"},{itemId:1,/** mongodb id*/itemCount:3,colorId:"colorId1"},{itemId:777,/** mongodb id*/itemCount:6,colorId:"colorId2"}]}]

Query

db.collection.aggregate([{"$match":{}/** <-- Highly recommend you to use match due to the complexity of this query*/},{"$unwind":{"path":"$shopItems",}},{"$facet":{"shopIds":[{"$group":{"_id":null,"shopIds":{"$addToSet":"$shopId"}}},{"$unwind":{"path":"$shopIds",}},{"$sort":{"shopIds":1}},{"$group":{"_id":null,"shopIds":{"$push":"$shopIds"}}},],"docRoot":[{"$group":{"_id":{"itemId":"$shopItems.itemId","colorId":"$shopItems.colorId","itemSum":"$shopItems.itemCount","shopIds":"$shopId",},"count":{"$sum":"$shopItems.itemCount",}}},{"$group":{"_id":{"itemId":"$_id.itemId","colorId":"$_id.colorId",},"shopCount":{"$push":{"shopId":"$_id.shopIds","count":"$count",}}},},],}},{"$unwind":{"path":"$docRoot",}},{"$project":{"itemId":"$docRoot._id.itemId","colorId":"$docRoot._id.colorId","shopId":"$complete.shopId","count":"$complete.count","keySwap":{"$reduce":{"input":{"$map":{"input":{"$map":{"input":{"$concatArrays":[{"$map":{"input":{"$setDifference":[{"$arrayElemAt":["$shopIds.shopIds",0]},{"$map":{"input":"$docRoot.shopCount","as":"elem","in":"$$elem.shopId"}},],},"as":"elem","in":{"shopId":"$$elem","count":0},},},"$docRoot.shopCount",]},"as":"elem","in":{"$objectToArray":"$$elem"}},},"as":"elem1","in":{"$arrayToObject":[[{"k":{"$arrayElemAt":["$$elem1.v",0]},"v":{"$arrayElemAt":["$$elem1.v",1]},}]],},},},"initialValue":{},"in":{"$mergeObjects":["$$value","$$this"]}},},}},{"$replaceRoot":{"newRoot":{"$mergeObjects":[{"itemId":"$itemId","colorId":"$colorId"},"$keySwap",]}}}])

Result