Rekursive Suche in einer Sammlung in MongoDB
Habe ich eine Liste der Dokumente in MongoDB mit Baumstruktur, wo Modell Baum-Strukturen mit Eltern-Referenzen Muster verwendet. Ich möchte eine einzelne aggregation Abfrage gibt vorfahrenliste(bis root), angesichts der 'name' - Eigenschaft.
Struktur:
{
'_id': '1',
'name': 'A',
'parent': '',
},
{
'_id': '2',
'name': 'B',
'parent': 'A',
},
{
'_id': '3',
'name': 'C',
'parent': 'B',
},
{
'_id': '4',
'name': 'D',
'parent': 'C',
}
Aggregation Ergebnis:(Gegeben, Namen = 'D')
{
'_id': '4',
'name': 'D',
'ancestors': [{name:'C'}, {name:'B'}, {name:'A'}]
}
Note:
Ich kann es nicht ändern, die Dokument-Struktur jetzt. Es wird viele Probleme verursachen. Ich sah viele Lösungen, die vorschlagen, die Verwendung Modell Baum-Strukturen mit einer Reihe von Vorfahren. Aber ich kann es jetzt verwenden. Gibt es eine Möglichkeit, es zu erreichen mit der oben genannten Muster mit Hilfe der single-aggregation-Abfrage? Danke
- Warum ist
_id
string? - Es ist nur ein Beispiel. Aktuelle doc wird mit ObjectId
- Gibt es etwas über Styvane Antwort, dass doesn ' T Arbeit für Sie, die Eingebung, die bounty?
- Styvane Antwort von MongoDB v3.4 ich war auf der Suche nach einer Möglichkeit, das arbeiten mit MongoDB v2.6 ab
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ab MongoDB 3.4, wir können dies tun, mit dem Aggregation Framework.
Die erste und wichtigste Stufe in der pipeline ist die
$graphLookup
Bühne.$graphLookup
ermöglicht uns die rekursiv-match auf der "übergeordneten" und "name" - Feld. Als Ergebnis erhalten wir die Ahnen der einzelnen "Namen".Die nächste Stufe in der pipeline ist die
$match
Bühne, wo wir wählen Sie einfach die "Namen" sind wir interessiert.Die Letzte Stufe ist die
$addFields
oder$project
Bühne, wo wir die Anwendung eines Ausdrucks auf die "Vorfahren" array mit der$anzeigen
array-operator.Natürlich mit der
$reverseArray
Betreiber wir reverse unser array, um ein korrektes Ergebnis zu erhalten.Wenn Sie offen sind, mit Hilfe von client-side javascript verwenden, können Sie die Rekursion auf die mongo shell, dies zu erreichen:
Dadurch erhalten Sie vollständige hirearchy für alle Produkte. Beispiel-Ausgabe:
Wenn Ihre Forderung nicht zu aktualisieren, die richtige Kollektion, einfügen der Daten in eine diffferent Sammlung, und aktualisieren Sie es. Die
pushAncesstors
Funktion zu ändern: