Abhängig von Ihrem Anwendungsfall MongoDB v3.4 bietet eine Aggregationspipeline Operator namens $graphLookup . Der Aggregationsoperator kann eine rekursive Suche in einer Sammlung durchführen. Weitere Definitionen finden Sie unter $graphLookup-Definition .
Wenn Sie Ihre Dokumentenhierarchie und die obigen Werte als Beispiele verwenden, könnten Sie versuchen, die folgende Aggregation auszuführen:
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"}
}}
]);
Das obige sollte das folgende Ergebnis zurückgeben:
{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }
Wenn Sie jedoch eine große Sammlung haben, ist die obige Abfrage möglicherweise nicht leistungsfähig, da Sie $unwind auf jedem Dokument und können keine Indizes verwenden. Wie von anderen vorgeschlagen, sollten Sie Ihre Dokumentmodellstruktur überdenken. Siehe Baumstrukturen von Datenmodellen . Optimieren Sie basierend auf Ihrer Anwendungslogik und Ihrem Abfrageanwendungsfall und lassen Sie das flexible Dokumentschema folgen.