2012-10-15 20 views
6

Sto lavorando all'implementazione di una struttura ad albero (simile a questa nei documenti Mongo) usando Mongoose 3.x, ma non sono sicuro del modo migliore per incapsulare tutta la logica per caricare un nodo specifico con i suoi fratelli e antenati in generale, e in particolare come lavorare al meglio con la funzionalità di popolazione in cui l'arbitro si trova nella stessa collezione del refer.Mongoose.js: Come implementare la struttura ad albero tramite la popolazione

Per alcuni contesti, l'albero su cui sto lavorando è uno in cui i nodi non vengono modificati, ma i nuovi bambini possono essere aggiunti in qualsiasi momento a qualsiasi nodo. Finora ho funzionato correttamente con una serie di metodi modello che caricano gli oggetti dopo la ricerca iniziale, ma sembra che ci dovrebbe essere un modo migliore per caricare facilmente un singolo ramo con tutti i dati genitore e fratello di cui ho bisogno con un singolo comando nel controller e incapsula tutta la popolazione pertinente in un metodo di ricerca conveniente sul modello.

Lo schema di base che sto cercando di lavorare con, quindi, potrebbe essere qualcosa di simile (disponibile anche qui: 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' } 
}); 

La mia speranza sarebbe quindi di essere in grado di caricare un ramo w/i relativi dati rilevanti tramite qualcosa di simile al seguente codice, anche se a questo punto sto praticamente perso e potrebbe essere un buon affare fuori base:

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

in definitiva, mi piacerebbe avere qualcosa che potrebbe abstrac t in un plug-in "tree" per Mongoose, ma penso che prima devo avere questo architettato correttamente. Qualche idea?

FWIW, alla fine della giornata, i dati di cui ho veramente bisogno per ogni ramo sono padre, fratello successivo, fratello precedente (sia in termini di tempo di creazione) sia tutti figli di genitore.

Grazie in anticipo!

risposta

1

So che questa domanda è vecchia, ma hai esaminato il modulo dell'albero di manguste? https://github.com/franck34/mongoose-tree

Ha un'API abbastanza buona per la gestione delle relazioni tra oggetti IMO.

Problemi correlati