Myslím, že něco takového chcete udělat. Tento dotaz jsem netestoval, ale na vašem místě bych to zkusil. To je možné pouze na 3.6 mongodb, protože podporuje více spojení. Cílem je spojit všechny 3 sbírky. První připojení je rodiče a osoba podle ID rodičů a osoby "rodičovské ID". Druhým spojením jsou rodiče a prarodiče. Poté vyfiltrujete podle jména prarodiče a získáte dokument, který obsahuje tohoto prarodiče, jeho syna (rodiče) a jeho vnuka (osobu). Pak už jen promítnete osobu.
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}}
}])
Myslím, že to bude stačit