Database

db={"entity":[{_id:1,name:"Entity 1"},{_id:2,name:"Entity 2"},{_id:3,name:"Entity 3"}],"devices":[{_id:1,entityKey:1,name:"Device 1"},{_id:2,entityKey:2,name:"Device 2"},/** { // If you uncomment this, then the query does not return the deviceKey-less event (i.e. the output is expected)* _id: 3,* entityKey: 3,* name: "Device 2"* }*/],"events":[{_id:1,deviceKey:1,name:"Event 1"},{_id:2,deviceKey:1,name:"Event 2"},{_id:3,/**deviceKey: 2, Notice the event is missing a device key*/name:"Event 3"}]}

Query

db.entity.aggregate([{$match:{_id:3}},{$lookup:{from:"devices",localField:"_id",foreignField:"entityKey",as:"devices"}},{$lookup:{from:"events",localField:"devices._id",foreignField:"deviceKey",as:"events",pipeline:[{$match:{deviceKey:{$ne:null}}}]}}])

Result