Penso che tu voglia fare qualcosa del genere. Non ho testato questa query, ma questo è quello che proverei al posto tuo. Questo è possibile solo su 3.6 mongodb, perché supporta più join. L'idea è di unire tutte e 3 le collezioni. Il primo join è Parents and Person by Parents id e Persons "parentsId". La seconda unione è Genitori e Nonni. Quindi filtri per nome del nonno e otterrai un documento che contiene quel nonno, suo figlio (genitore) e suo nipote (persona). Quindi proietti semplicemente la persona.
db.Parents.aggregate([
{
$lookup:{
from:"Person",
localField:"_id",
foreignField:"parentId",
as:"Person"
}
},
{
$unwind:"$Person"
},
{
$lookup:{
from:"Grandparents",
localField:"grandparentId",
foreignField:"_id",
as:"Grandparents"
}
},
{
$unwind:"$Grandparents"
},
{$match:{Grandparents.name:"x"}},
{$project:{Person.name:1,Person._id:1}}
}])
Penso che questo farà il trucco