Myślę, że chcesz zrobić coś takiego. Nie testowałem tego zapytania, ale tego bym spróbował na Twoim miejscu. Jest to możliwe tylko w wersji 3.6 mongodb, ponieważ obsługuje wiele złączeń. Ideą jest połączenie wszystkich 3 kolekcji. Pierwsze połączenie to Parents i Person by Parents id, a Persons "parentsId". Drugie połączenie to Rodzice i Dziadkowie. Następnie filtrujesz według nazwiska dziadka, a otrzymasz dokument zawierający tego dziadka, jego syna (rodzica) i wnuka (osobę). Następnie po prostu wyświetlasz osobę.
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}}
}])
Myślę, że to załatwi sprawę