В зависимост от вашия случай на употреба, 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 на всеки документ и няма да може да използва индекси. Както е предложено от други, трябва да преразгледате структурата на вашия модел на документа. Вижте Дървовидни структури на модели на данни . Оптимизирайте въз основа на логиката на вашето приложение и случая на използване на заявки и оставете гъвкавата документна схема да последва.