2013-01-30 10 views
9

Nie wiem, jak wypełnić poniższy przykładowy schemat lub czy jest to możliwe. Czy odniesienie może znajdować się w obiekcie takim jak poniżej? Jeśli możesz, w jaki sposób zapełnisz to? Na przykład. .populate('map_data.location');?Mongooza wypełnia się w obiekcie?

var sampleSchema = new Schema({ 
    name: String, 
    map_data: [{ 
    location: {type: Schema.Types.ObjectId, ref: 'location'}, 
    count: Number 
    }] 
}); 

Albo będę mieć dwa oddzielne tablice na miejscu i liczyć tak:

// Locations and counts should act as one object. They should 
// Be synced together perfectly. E.g. locations[i] correlates to counts[i] 
locations: [{ type: Schema.Types.ObjectId, ref: 'location'}], 
counts: [Number] 

czuję się pierwsze rozwiązanie byłoby najlepsze, ale nie jestem do końca pewien, jak spraw, żeby działało w Mongoose.

Dziękuję bardzo za pomoc!

Odpowiedz

14

Pierwsze rozwiązanie jest możliwe.

Mongoose ma obecnie ograniczenia (see this ticket here) wypełniania wielu poziomów osadzonych dokumentów, jednak jest bardzo dobry w zrozumieniu zagnieżdżonych ścieżek w obrębie jednego dokumentu - co jesteś po w tym przypadku.

przykład składni to:

YourSchema.find().populate('map_data.location').exec(...)

inne funkcje, takie jak określanie pobierające/ustawiające na ścieżkach orderby i gdzie klauzule itp również przyjąć zagnieżdżonych ścieżek, jak w tym przykładzie z docs:

personSchema.virtual('name.full').get(function() { 
    return this.name.first + ' ' + this.name.last; 
}); 

Wewnętrznie Mongoose dzieli sznur w kropki i wszystko dla ciebie sortuje.

+0

Dziękuję bardzo! –

+0

Co do drugiego punktu: Czy masz najlepszy element? Jeśli tak, podaj wszystko: top_id i parent_id. Lub tablica potomków i tablica dzieci. Następnie weź wszystko od góry i uporządkuj dziedziczenie po stronie klienta. – Funkodebat

1

Pierwsza opcja jest najlepsza. "count" jest częścią obiektu "map_data".

4

Pierwsza opcja jest ok, ale jeśli ktoś ma problemy z tym zapytaniem map_data.location - Mongoose zwraca pustą tablicę zamiast obiektu - Okazało się, że to będzie działać:

.populate({ 
    path: 'map_data.location', 
    model: 'Location' 
}) 
Powiązane problemy