MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Ricerca ricorsiva su una raccolta in MongoDB

A partire da MongoDB 3.4, possiamo farlo con Aggregation Framework.

La prima e più importante fase della nostra pipeline è il $graphLookup palcoscenico. $graphLookup ci consente di abbinare ricorsivamente il campo "genitore" e "nome". Di conseguenza, otteniamo gli antenati di ogni "nome".

La fase successiva della pipeline è il $match fase in cui selezioniamo semplicemente il "nome" che ci interessa.

La fase finale è il $addFields o $project fase in cui applichiamo un'espressione all'array "ancestors" utilizzando $map operatore di array.

Ovviamente con $reverseArray operatore invertiamo il nostro array per ottenere il risultato atteso.

db.collection.aggregate(
    [ 
        { "$graphLookup": { 
            "from": "collection", 
            "startWith": "$parent", 
            "connectFromField": "parent", 
            "connectToField": "name", 
            "as": "ancestors"
        }}, 
        { "$match": { "name": "D" } }, 
        { "$addFields": { 
            "ancestors": { 
                "$reverseArray": { 
                    "$map": { 
                        "input": "$ancestors", 
                        "as": "t", 
                        "in": { "name": "$$t.name" }
                    } 
                } 
            }
        }}
    ]
)