2016-01-25 5 views
11

Ich arbeite am Entwerfen einer Datenbankstruktur für ein neues Projekt, und ich bin ziemlich neu in MongoDB und natürlich Mongoose.Mongoose Dokumentverweise mit einer Eins-zu-viele-Beziehung

Ich habe gelesen, Mungos population Dokumentation, wo es eine Beziehung einer Eins-zu-viele hat, mit einem Person Dokument zu vielen Story Dokumenten, aber der Teil, den ich verwirrt ist, wo statt der Story Dokumente verweisen, was Person es Dokument gehört zu, das Person Schema hat es eingerichtet, so hat es eine Reihe von was Story dokumentiert es "besitzt".

Ich richte etwas sehr ähnliches ein. Aber ich denke, es wäre einfacher, wenn Sie neue Story Dokumente erstellen, um die Person Dokument-ID zu haben. Aber vielleicht liegt es daran, dass ich mit MySQL-Beziehungen, die Joins verwenden, vertrauter bin.

Wenn dies die beste Möglichkeit ist (und ich bin mir sicher, es ist, seit es in der Dokumentation), wenn neue Story Dokumente erstellt werden, was ist der beste Weg, um das Array von Geschichten in der zugehörigen People zu aktualisieren Dokument, zu dem es gehört? Ich habe gesucht, konnte aber keine Beispiele für die Aktualisierung vorhandener Dokumente finden, um Referenzen zu anderen Dokumenten hinzuzufügen (oder sie zu löschen)

Ich bin mir sicher, dass dies eine einfache Lösung ist, die ich einfach übersehen habe oder so, aber jede Hilfe wäre großartig. Vielen Dank!

+0

Welche Aktualisierung möchten Sie? –

+0

Ich war mir nicht bewusst, dass es mehr als eine Art von Update gab? Ich versuche, diese durch die Mongoose-Modelle zu aktualisieren, aber ich denke, das ist nicht das, was Sie meinen – Justin

+0

können Sie sagen, was genau Sie tun möchten? in Personen-Geschichten-Array einschieben, etwas löschen, jede Geschichte ändern oder etwas anderes? –

Antwort

15

Siehe population, hier ein Beispiel aus Mongoose extrahieren.

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); 

So das Beispiel über, Story Modell speichert Person._id in Story._creator bezogen. Wenn Sie ein Dokument von Story finden, können Sie populate() Methode verwenden, um festzulegen, welches Attribut in Person Modell mögen Sie zur gleichen Zeit abzurufen, wie zB:

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); 
}); 

Ich glaube, das ist das, was Sie suchen. Oder Sie können stattdessen nested collections verwenden.

+0

Ok, so wird der' Story._creator' automatisch auf die übergeordnete 'Person._id' verweisen? Oder müssen Sie die Werte für "Story._creator" und "Person.stories" separat aktualisieren? Worüber ich eigentlich mehr besorgt bin, ist, wenn Sie eine neue Geschichte erstellen .. Was ist der beste Weg, um die Eltern Geschichten Array aktualisieren? Gibt es eine Möglichkeit, die neue ID mit einer einzigen Abfrage dorthin zu übertragen? Oder müssen Sie das gesamte Dokument abfragen, dann die neue Geschichte in das Array "Person.stories" schieben und dann das Dokument "Person" aktualisieren? – Justin

+0

Haben Sie sowohl die 'Story._creator' und die' Person.stories' Werte separat zu aktualisieren? Oder gibt es eine Möglichkeit, die "Person.stories" automatisch zu füllen, wenn Sie ein neues "Story" -Dokument erstellen? – Justin

+1

Ja, Sie müssen beide aktualisieren. [mongoose bevölkern] (http://mongoosejs.com/docs/populate.html) Abschnitt über Refs für Kinder –

2

Wie in population docs sagte

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); 
});