2016-01-25 9 views
11

Pracuję nad zaprojektowaniem struktury bazy danych dla nowego projektu i jestem całkiem nowy dla MongoDB i oczywiście Mongoose.Odsyłacze do dokumentów Mongoose ze związkiem jeden do wielu

Czytałem mangusty population dokumentacji, w przypadku gdy ma relacji jeden-do-wielu, z jednym Person dokumentu do wielu Story dokumentów, ale część, która mnie niepokoi jest, gdy zamiast dokumentów Story przedstawieniu co Person to dokument należy do schematu Person ma to ustawienie, więc ma tablicę tego, co "jest" właścicielem.

Przygotowuję coś bardzo podobnego do tego. Ale wciąż myślę, że łatwiej będzie tworzyć nowe dokumenty , aby mieć identyfikator dokumentu Person. Ale może to tylko dlatego, że jestem bardziej zaznajomiony z relacjami MySQL za pomocą złączeń.

Jeśli jest to najlepszy sposób na zrobienie tego (i jestem pewien, że jest, ponieważ jest w dokumentach), kiedy tworzone są nowe dokumenty Story, jaki jest najlepszy sposób aktualizacji tablicy historii w powiązanym People dokument, do którego należy? Sprawdziłem, ale nie znalazłem przykładów aktualizacji istniejących dokumentów, aby dodać odniesienia do innych dokumentów (lub ich skasowanie).

Jestem pewien, że jest to proste rozwiązanie, którego właśnie przeoczyłem lub coś, ale jakakolwiek pomoc byłoby wspaniale. Dzięki!

+0

Jakie aktualizowania chcesz? –

+0

Nie wiedziałem, że istnieje więcej niż jeden rodzaj aktualizacji? Próbuję zaktualizować je za pomocą modeli Mongoose, ale domyślam się, że nie to, co masz na myśli – Justin

+0

, możesz powiedzieć, co dokładnie chcesz zrobić? wciskać w tablice osobistych historii, usuwać coś, modyfikować każdą historię lub coś innego? –

Odpowiedz

15

Odwołaj się do przykładu z Mongoose.

var mongoose = require('mongoose') 
, Schema = mongoose.Schema 

var personSchema = Schema({ 
    _id  : Number, 
    name : String, 
    age  : Number, 
    stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }] 
}); 

var storySchema = Schema({ 
    _creator : { type: Number, ref: 'Person' }, 
    title : String, 
    fans  : [{ type: Number, ref: 'Person' }] 
}); 

var Story = mongoose.model('Story', storySchema); 
var Person = mongoose.model('Person', personSchema); 

Więc przykład o, Story modelowych sklepach związanych Person._id w Story._creator. Po znalezieniu dokumentu Story, można użyć populate() sposób zdefiniować, który atrybut w Person modelu chcesz odzyskać w tym samym czasie, takich jak:

Story.findOne({_id: 'xxxxxxx'}).populate('person', 'name age').exec(function(err, story) { 
    console.log('Story title: ', story.title); 
    console.log('Story creator', story.person.name); 
}); 

Wierzę, że to jest to, czego szukasz. Albo możesz zamiast tego użyć nested collections.

+0

Ok, więc 'Story._creator' odwoła się do nadrzędnego' Person._id' automatycznie? Czy musisz aktualizować osobno wartości 'Story._creator' i' Person.stories'? To, co mnie bardziej martwi, to kiedy tworzysz nową historię. Jaki jest najlepszy sposób na aktualizację tablicy "story" rodziców? Czy istnieje sposób na przekazanie nowego identyfikatora za pomocą pojedynczego zapytania? Czy musisz zapytać o cały dokument, a następnie wprowadzić nową historię do tablicy "Person.stories", a następnie zaktualizować dokument "Person"? – Justin

+0

Czy trzeba aktualizować oddzielnie wartości 'Story._creator' i' Person.stories'? A może istnieje sposób na automatyczne wypełnianie "Person.stories" podczas tworzenia nowego dokumentu "Story"? – Justin

+1

Tak, musisz zaktualizować oba. [Mongoose populate] (http://mongoosejs.com/docs/populate.html) sekcja o Odniesień do dzieci –

2

jak w population docs powiedział

var aaron = new Person({ _id: 0, name: 'Aaron', age: 100 }); 

aaron.save(function (err) { 
    if (err) return handleError(err); 

    var story1 = new Story({ 
    title: "Once upon a timex.", 
    _creator: aaron._id // assign the _id from the person 
    }); 

    story1.save(function (err) { 
    if (err) return handleError(err); 
    // thats it! 
    }); 
    //then add story to person 
    aaron.stories.push(story1); 
    aaron.save(callback); 
}); 
Powiązane problemy