ユースケースに応じて、 MongoDB v3.4 集約パイプライン を提供します $graphLookup という演算子 。集計演算子は、コレクションに対して再帰検索を実行できます。 $graphLookupの定義 で詳細な定義を参照してください 。
上記のドキュメント階層と値を例として使用して、以下の集計を実行してみることができます。
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"}
}}
]);
上記は以下のような結果を返すはずです:
{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }
そうは言っても、コレクションが大きい場合は、 $ unwind 各ドキュメントで、インデックスを利用できなくなります。他の人が示唆しているように、ドキュメントモデルの構造を再検討する必要があります。 データモデルのツリー構造 を参照してください。 。アプリケーションロジックとクエリのユースケースに基づいて最適化し、柔軟なドキュメントスキーマに従うようにします。