Database
db={"appusers":[{name:"person1",age:36,gender:"Male",preference:{age_from:28,age_to:35}},{name:"person2",age:18,gender:"Female",preference:{age_from:25,age_to:40}},{name:"person3",age:26,gender:"Female",preference:{age_from:30,age_to:35}},{name:"person4",age:26,gender:"Female",preference:{age_from:30,age_to:40}}]}
Query
db.appusers.aggregate([{$lookup:{from:"appusers",let:{gen:"$gender",pref:"$preference"},pipeline:[{$match:{$and:[{$expr:{$ne:["$gender","$$gen"]}},{$or:[{age:{$exists:false}},{$expr:{$and:[{$gte:["$age","$$pref.age_from"]},{$lte:["$age","$$pref.age_to"]}]}}]}]}}],as:"matches"}}])