2012-08-11 15 views
19

In MongoDB/Mongoose, come si definisce una relazione? Penso che ci siano alcuni modi in cui ho visto, ma non sono sicuro di capire le differenze o quando lo uso. Sto usando Mongoose 3Informazioni sulle relazioni e chiavi esterne in Mongoose

Ho definito il modello Todo e TodoList, in cui la relazione è ovvia. classi in seguito l'docs http://mongoosejs.com/docs/documents.html, ho definito come:

# Todo.coffee 
mongoose = require "mongoose" 

todoSchema = mongoose.Schema 
    name: String 
    desc: String 
    dueOn: Date 
    completedOn: Date 

module.exports = mongoose.model "Todo", todoSchema 

# TodoList.coffee 

mongoose = require "mongoose" 
Todo = require "./Todo" 

todoListSchema = mongoose.Schema 
    name: String 
    todos: [Todo.schema] 

module.exports = mongoose.model "TodoList", todoListSchema 

poi ho provato il test delle classi:

list = new TodoList 
    name: "List 1" 
    todos: [ 
     { name: "Todo 1", desc: "Hello", dueOn: new Date(2012,10,1), completedOn: new Date(2012,10,2) } 
     { name: "Todo 2" } 
     { name: "Todo 3", desc: "Hello 2", dueOn: new Date(2012,10,6), completedOn: new Date(2012,10,2) } 
     { name: "Todo 4" } 
    ] 
#list.todos.push { name: "Todo 5" } 
console.log "List", list 
list.save (err) -> 
    if !err 
     TodoList.find {}, (err, lists) -> 
      console.log "TODOS" 
      console.log lists.length, lists 
      done(err) 
    else 
     console.log "ERROR!!!" 
     done err 

Quando provo a fare Todo.find() non ottengo niente, così il modello (Todo.coffee) è una specie di ridondante? Sembra che Todo siano memorizzati in TodoList, come utente a cui non mi interessa, ma mi chiedo quali sono le implicazioni? Per esempio. il documento diventerà troppo grande? 1 TodoList con troppi Todos? È importante? Cosa succede se permetto a Todos annidati (non che io voglia farlo solo per capire), è meglio memorizzare i documenti separatamente? Come posso farlo, se lo desidero e quando lo faccio?

Ho visto un altro metodo, in Mongoose 2 in realtà, non so se è possibile in 3, qualcosa di simile a utilizzare ObjectId invece di documenti nidificati. Forse è per memorizzarlo separatamente?

risposta

34

Sono ancora nuovo per Node, Mongoose e Mongo, ma penso di poter rispondere almeno in parte alla tua domanda. :)

Il tuo metodo attuale è lo stesso che ho provato a fare all'inizio. In sostanza, finisce per riporlo in modo molto simile a questo (scritto in JS, dal momento che non so CoffeeScript):

var todoListSchema = new mongoose.Schema({ 
    name: String, 
    todos: [{ 
     name: String, 
     desc: String, 
     dueOn: Date, 
     completedOn: Date 
    }] 
}); 

successivamente ho scoperto questo metodo, che è quello che cercavo, e penso che ciò che avevate intenzione:

var todoListSchema = new mongoose.Schema({ 
    name: String, 
    todos: [{ 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'Todo' //Edit: I'd put the schema. Silly me. 
    }] 
}); 

Questo memorizza una serie di objectIds, che è quindi possibile caricare utilizzando Query#populate in Mongoose.

Non conosco le implicazioni tecniche, ma ha più senso nel mio cervello se le tengo separate, quindi è quello che sto facendo. :)

Edit: Ecco un alcuni documenti ufficiali che potrebbero essere utili: http://mongoosejs.com/docs/populate.html

+4

Schema.Types.ObjectId ha una versione compatibilità v2: Schema.ObjectId; questo mi ha confuso per un po ' –

Problemi correlati