Bergantung pada kasus penggunaan Anda, MongoDB v3.4 menyediakan pipa agregasi operator bernama $graphLookup . Operator agregasi dapat melakukan pencarian rekursif pada koleksi. Lihat definisi lainnya di Definisi $graphLookup .
Dengan menggunakan hierarki dan nilai dokumen Anda di atas sebagai contoh, Anda dapat mencoba menjalankan agregasi di bawah ini:
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"}
}}
]);
Di atas harus mengembalikan hasil seperti di bawah ini:
{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }
Karena itu, jika Anda memiliki banyak koleksi, kueri di atas mungkin tidak berfungsi karena Anda akan melakukan $unwind pada setiap dokumen dan tidak akan dapat menggunakan indeks. Seperti yang disarankan oleh orang lain, Anda harus mempertimbangkan kembali struktur model dokumen Anda. Lihat Struktur Pohon Model Data . Optimalkan berdasarkan logika aplikasi dan kasus penggunaan kueri Anda, dan biarkan skema dokumen fleksibel mengikuti.