V závislosti na vašem případu použití MongoDB v3.4 poskytuje agregační kanál operátor s názvem $graphLookup . Operátor agregace je schopen provádět rekurzivní vyhledávání v kolekci. Další definice naleznete v definici $graphLookup .
Pomocí výše uvedené hierarchie dokumentů a hodnot můžete zkusit spustit agregaci pod:
db.collectionName.aggregate([
{$unwind:{
path:"$childrenIdList",
preserveNullAndEmptyArrays: true}
},
{$graphLookup:{
from:"collectionName",
startWith:"$_id",
connectFromField:"_id",
connectToField:"childrenIdList",
as:"myparents",
restrictSearchWithMatch: {"_id"}}
},
{$match: {"_id": 7 } },
{$group:{
_id:"$_id",
parents:{$addToSet:"$myparents._id"}
}}
]);
Výše uvedené by mělo vrátit výsledek jako níže:
{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }
Pokud však máte velkou sbírku, výše uvedený dotaz nemusí být výkonný, protože budete provádět $unwind na každém dokumentu a nebude možné používat indexy. Jak navrhují ostatní, měli byste znovu zvážit strukturu modelu dokumentu. Viz Stromové struktury datových modelů . Optimalizujte na základě vaší aplikační logiky a případu použití dotazování a nechte flexibilní schéma dokumentu následovat.