W zależności od przypadku użycia MongoDB v3.4 udostępnia potok agregacji operator o nazwie $graphLookup . Operator agregacji może przeprowadzić wyszukiwanie cykliczne w kolekcji. Zobacz więcej definicji definicji $graphLookup .
Używając hierarchii dokumentów i powyższych wartości jako przykładów, możesz spróbować uruchomić agregację poniżej:
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"}
}}
]);
Powyższe powinno zwrócić wynik jak poniżej:
{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }
To powiedziawszy, jeśli masz dużą kolekcję, powyższe zapytanie może nie być skuteczne, ponieważ wykonasz $unwind na każdym dokumencie i nie będą mogli korzystać z indeksów. Jak sugerują inni, powinieneś ponownie rozważyć strukturę modelu dokumentu. Zobacz Struktury drzewiaste modeli danych . Optymalizuj w oparciu o logikę aplikacji i przypadek użycia zapytań i pozwól, aby podążał za elastycznym schematem dokumentu.