2012-10-15 13 views
6

Pracuję nad zaimplementowaniem struktury drzewa (podobnej do tej w dokumentach Mongo) przy użyciu Mongoose 3.x, ale nie jestem pewien najlepszego sposobu na enkapsulację cała logika do ładowania określonego węzła z jego rodzeństwem i przodkami, a zwłaszcza jak najlepiej pracować z funkcjonalnością populacji, gdzie ref jest w tym samym zbiorze, co refiler.Mongoose.js: W jaki sposób zaimplementować strukturę drzewa przez populację

Dla niektórych kontekstów drzewo, z którym pracuję, to takie, w którym węzły nie są edytowane, ale nowe dzieci mogą być dodawane w dowolnym czasie do dowolnego węzła. Do tej pory mam to działa dobrze z zestawem metod modelowych, które ładują obiekty po początkowym znalezieniu, ale wydaje się, że powinien istnieć lepszy sposób na łatwe ładowanie pojedynczego oddziału z wszystkimi danymi rodzica i rodzeństwa, których potrzebuję z pojedynczym polecenie w sterowniku i obuduj całą odpowiednią populację w jakiejś wygodnej metodzie szukania w modelu.

Podstawowym Schema Próbuję pracować, wtedy może być coś takiego (również dostępne tutaj: 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' } 
}); 

Mam nadzieję, że wówczas, aby móc załadować oddział w/odpowiednich powiązanych danych poprzez coś podobnego do następującego kodu, choć w tym momencie mam dość dużo stracił i może być dobry interes off podstawa:

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

Ostatecznie, ja bym chciał mieć coś ja mógłbym abstrac t do "drzewa" wtyczki do Mongoose, ale myślę, że najpierw muszę to poprawnie zaprojektować. Jakieś pomysły?

FWIW, na koniec dnia, dane, których naprawdę potrzebuję dla każdego oddziału, to rodzic, następny rodzeństwo, poprzednie rodzeństwo (zarówno pod względem czasu utworzenia), jak i wszystkie dzieci rodzica.

Z góry dziękuję!

Odpowiedz

Powiązane problemy