2016-01-25 7 views
11

Sto lavorando alla progettazione di una struttura di database per un nuovo progetto, e sono abbastanza nuovo per MongoDB e ovviamente Mongoose.Riferimenti di documenti Mongoose con una relazione uno-a-molti

Ho letto Manguste population documentazione, dove si ha una relazione uno-a-molti, con un Person documento a molti Story documenti, ma la parte che confonde me è dove al posto dei documenti Story riferimento a quello Person documento che appartiene a, lo schema Person lo ha impostato in modo che abbia una matrice di ciò che è Story i documenti che "possiede".

Sto impostando qualcosa di molto simile a questo. Ma continuo a pensare che sarebbe più facile creare nuovi documenti Story con l'ID del documento Person. Ma forse questo è solo perché ho più familiarità con le relazioni MySQL usando i join.

Se questo è il modo migliore per farlo (e sono sicuro che sia, dal momento che è nella documentazione), quando vengono creati nuovi documenti Story, qual è il modo migliore per aggiornare l'array di storie negli associati People documento a cui appartiene? Ho cercato ma non ho trovato alcun esempio di aggiornamento dei documenti esistenti per aggiungere riferimenti ad altri documenti (o eliminarli)

Sono sicuro che questa è una soluzione semplice che ho appena trascurato o qualcosa del genere, ma qualsiasi aiuto sarebbe bello. Grazie!

+0

Che tipo di aggiornamento vuoi? –

+0

Non sapevo che esistesse più di un tipo di aggiornamento? Sto cercando di aggiornare questi attraverso i modelli Mongoose, ma immagino che non è quello che intendi – Justin

+0

potresti dirmi esattamente cosa vuoi fare? spingere in fila le storie di persone, cancellare qualcosa, modificare ogni storia o qualcos'altro? –

risposta

15

Vedere population, qui estrarre un esempio da 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); 

Quindi l'esempio circa, Story negozi modello relativi Person._id in Story._creator. Quando si trova un documento di Story, è possibile utilizzare populate() metodo per definire quale attributo in Person modello che si desidera recuperare, allo stesso tempo, come ad esempio:

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

Credo che questo è ciò che si cerca. Oppure puoi utilizzare nested collections.

+0

Ok, quindi' Story._creator' farà automaticamente riferimento al genitore 'Person._id'? O devi aggiornare separatamente i valori di 'Story._creator' e' Person.stories'? Quello di cui sono più preoccupato, è quando crei una nuova storia .. Qual'è il modo migliore per aggiornare la matrice 'stories' dei genitori? C'è un modo per spingere il nuovo Id su di esso con una singola query? O devi interrogare per l'intero documento, quindi spingere la nuova storia nella matrice 'Person.stories', quindi aggiornare il documento' Persona'? – Justin

+0

Devi aggiornare separatamente i valori di 'Story._creator' e' Person.stories'? O c'è un modo per popolare automaticamente il 'Person.stories' quando si crea un nuovo documento' Story'? – Justin

+1

Sì, è necessario aggiornare entrambi. [mangusta popolare] (http://mongoosejs.com/docs/populate.html) about Refs to children –

2

Come in population docs detto

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