2012-08-11 15 views
19

En MongoDB/Mangosta, ¿cómo puedo definir una relación? Creo que hay algunas maneras que he visto, pero no estoy seguro de entender las diferencias o cuándo las uso. Estoy usando Mongoose 3Entender las relaciones y las claves externas en Mongoose

He definido Todo y TodoList modelo, donde la relación es obvia. Así clases siguiendo el docs http://mongoosejs.com/docs/documents.html, he definido como:

# 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 

Luego he intentado probar las clases:

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 

Cuando intento hacer Todo.find() no consigo nada, por lo que el modelo (Todo.coffee) es algo redundante? Parece que Todo se almacenan en TodoList, como usuario no me importa, pero me pregunto cuáles son las implicaciones? P.ej. ¿el documento será demasiado grande? 1 TodoList con demasiados Todos? ¿Eso importa? ¿Qué sucede si permití Todos anidados (no es que quiera hacerlo solo para entenderlo)? ¿Es mejor almacenar documentos por separado entonces? ¿Cómo hago eso, si así lo deseo, y cuándo lo hago?

Vi otro método, en Mongoose 2 en realidad, no sé si es posible en 3, algo así como usar ObjectId en lugar de documentos anidados. Tal vez eso es almacenarlo por separado?

Respuesta

34

Todavía soy nuevo en Node, Mongoose y Mongo, pero creo que puedo abordar al menos parte de su pregunta. :)

Su método actual es el mismo que he intentado hacer al principio. Básicamente, se termina almacenarlo de manera muy similar a este (escrito en JS, ya que no sé CoffeeScript):

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

después encontré este método, que es lo que estaba buscando, y creo que lo estabas intención:

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

Esto almacena una matriz de ObjectID, que luego se puede cargar utilizando Query#populate en Mongoose.

No conozco las implicaciones técnicas, pero tiene más sentido en mi cerebro si las mantengo separadas, así que eso es lo que estoy haciendo. :)

Editar: aquí hay una algunos documentos oficiales que pueden ser útiles: http://mongoosejs.com/docs/populate.html

+4

Schema.Types.ObjectId tiene una versión de compatibilidad v2: Schema.ObjectId; esto me tenía confundido por un tiempo –

Cuestiones relacionadas