2012-10-15 11 views
6

Ich arbeite mit Mongoose 3.x an der Implementierung einer Baumstruktur (ähnlich der in den Mongo-Dokumenten), aber ich bin nicht sicher über die beste Art zu kapseln die gesamte Logik zum Laden eines bestimmten Knotens mit seinen Geschwistern und Vorfahren im Allgemeinen und speziell, wie man am besten mit der Populationsfunktionalität arbeitet, wo der Verweis in der gleichen Sammlung wie der Verweis ist.Mongoose.js: Wie man Baumstruktur über Bevölkerung einführt

In einigen Kontexten handelt es sich bei dem Baum, mit dem ich arbeite, um Knoten, die nicht bearbeitet werden, aber neue untergeordnete Elemente können jederzeit zu jedem Knoten hinzugefügt werden. Bis jetzt funktioniert das gut mit einer Reihe von Modellmethoden, die Objekte nach der ersten Suche laden, aber es scheint, dass es einen besseren Weg geben sollte, einfach einen Zweig mit allen Eltern- und Geschwisterdaten zu laden, die ich mit einem einzigen brauche Befehl in der Steuerung, und kapseln Sie alle relevanten Population in einer bequemen Suche Methode auf dem Modell.

Das grundlegende Schema, mit dem ich zu arbeiten bin versucht, könnte dann sein, so etwas wie (auch hier zur Verfügung: https://gist.github.com/3889616):

// Sub-document to store parent ref along with it's value (a form of caching) 
var Parent = new Schema({ 
    id: ObjectId 
    , text: String 
}); 

// Main tree-node element schema 
var Branch = new Schema({ 
    text: { 
     type: String 
     , required: true } 
    , date: {type: Date, default: Date.now } 
    , trail: [Parent] 
    , parentBranchId: ObjectId 
    , parentBranch: { type: Schema.Types.ObjectId, ref: 'Branch' } 
    , _children: [{type: Schema.Types.ObjectId, ref: 'Branch'}] 
    // These two have been commented out because I have no clue how to best implement 
    // , _priorSiblings: { type: Schema.Types.ObjectId, ref: 'Branch' } 
    // , _followingSiblings: { type: Schema.Types.ObjectId, ref: 'Branch' } 
}); 

würde Meine Hoffnung dann in der Lage sein wird, um ein laden Zweig w/den jeweiligen zugehörigen Daten über so etwas wie den folgenden Code, an dieser Stelle, obwohl ich ziemlich bin verloren und könnte ein gutes Geschäft off base:

req.app.models.Branch 
    .findById(req.param("id")) 
    .populate("parentBranch") 
    .populate("parentBranch._children") 
    .exec(...) 

Letztendlich würde ich gerne etwas, was ich haben könnte abstrac t in ein "Baum" -Plugin für Mongoose, aber ich denke, dass ich diese Architektur zuerst korrekt erstellen muss. Irgendwelche Ideen?

FWIW, am Ende des Tages, die Daten, die ich wirklich für jeden Zweig brauche, ist Eltern, nächste Geschwister, vorherige Geschwister (beide in Bezug auf die Erstellungszeit) und alle Kinder des Elternteils.

Vielen Dank im Voraus!

Antwort

1

Ich weiß, dass diese Frage alt ist, aber haben Sie in das Mungo-Baum-Modul geschaut? https://github.com/franck34/mongoose-tree

Es hat eine ziemlich gute API für die Behandlung von Beziehungen zwischen Objekten IMO.

Verwandte Themen