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?
Schema.Types.ObjectId tiene una versión de compatibilidad v2: Schema.ObjectId; esto me tenía confundido por un tiempo –