Database
[{"CaseNum":"123","ProcessingStage":"Error","body2":{"data":{}}},{"CaseNum":"123","ProcessingStage":"Start","body1":{"data":{}}},{"CaseNum":"123","ProcessingStage":"Success","body2":{"data":{}}},{"CaseNum":"456","ProcessingStage":"Start","body1":{"data":{}}},{"CaseNum":"456","ProcessingStage":"Error","body2":{"data":{}}},{"CaseNum":"789","ProcessingStage":"Start","body1":{"data":{}}}]
Query
db.collection.aggregate([/** group all docs by case num*/{$group:{_id:"$CaseNum",processingStages:{$push:"$ProcessingStage"},/** only get body 1 from start stage*/body1:{$push:{$cond:[{$eq:["$ProcessingStage","Start"]},"$body1","$$REMOVE"]}}}},/** check your condition,* case shouldn't have success and must have error*/{$match:{$and:[{processingStages:{$in:["Error"]}},{processingStages:{$nin:["Success"]}}]}},/** extract body1 as object*/{"$unwind":"$body1"}])