MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment interroger l'arborescence de manière récursive avec MongoDB ?

Selon votre cas d'utilisation, MongoDB v3.4 fournit un pipeline d'agrégation opérateur appelé $graphLookup . L'opérateur d'agrégation est capable d'effectuer une recherche récursive sur une collection. Voir plus de définition sur $graphLookup definition .

En utilisant la hiérarchie de vos documents et les valeurs ci-dessus comme exemples, vous pouvez essayer d'exécuter l'agrégation ci-dessous :

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"}
                  }}
]);

Ce qui précède devrait renvoyer le résultat ci-dessous :

{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }

Cela dit, si vous avez une grande collection, la requête ci-dessus peut ne pas être performante car vous effectuerez $unwind sur chaque document et ne pourra pas utiliser les index. Comme suggéré par d'autres, vous devriez reconsidérer la structure de votre modèle de document. Voir Structures arborescentes des modèles de données . Optimisez en fonction de votre logique d'application et de votre cas d'utilisation d'interrogation, et laissez le schéma de document flexible suivre.