Dependendo do seu caso de uso, MongoDB v3.4 fornece um pipeline de agregação operador chamado $graphLookup . O operador de agregação é capaz de realizar uma pesquisa recursiva em uma coleção. Veja mais definições em definição de $graphLookup .
Usando sua hierarquia de documentos e valores acima como exemplos, você pode tentar executar a agregação abaixo:
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"}
}}
]);
O acima deve retornar o resultado como abaixo:
{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }
Dito isto, se você tiver uma grande coleção, a consulta acima pode não funcionar, pois você estará executando $unwind em cada documento e não poderá utilizar índices. Conforme sugerido por outros, você deve reconsiderar sua estrutura de modelo de documento. Consulte Estruturas de árvore de modelos de dados . Otimize com base na lógica do aplicativo e no caso de uso de consulta e deixe o esquema de documento flexível seguir.