mongodb - multiple - Entendiendo las relaciones y las claves externas en Mangosta
multiple populate mongoose (1)
Todavía soy nuevo en Node, Mongoose y Mongo, pero creo que puedo abordar al menos parte de tu pregunta. :)
Tu método actual es el mismo que intenté hacer al principio. Básicamente, termina almacenándolo de forma muy similar a esto (escrito en JS, ya que no sé CoffeeScript):
var todoListSchema = new mongoose.Schema({
name: String,
todos: [{
name: String,
desc: String,
dueOn: Date,
completedOn: Date
}]
});
Más tarde encontré este método, que es lo que estaba buscando, y creo que lo que pretendías era:
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 ObjectIds, que luego puede cargar utilizando la 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. :)
Edición: Aquí hay algunos documentos oficiales que pueden ser útiles: http://mongoosejs.com/docs/populate.html
En MongoDB / Mongoose, ¿cómo defino una relación? Creo que hay algunas formas en las que he visto, pero no estoy seguro de entender las diferencias o cuándo las uso. Estoy usando mangosta 3
He definido el modelo Todo
y TodoList
, donde la relación es obvia. Así que siguiendo los documentos http://mongoosejs.com/docs/documents.html , he definido clases 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
Entonces intenté 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 obtengo nada, ¿el modelo ( Todo.coffee
) es un poco redundante? Parece que Todo
está almacenado en TodoList
, como un 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é pasa si permito a Todos anidados (no es que quiera hacerlo solo por comprensión), es mejor almacenar los documentos por separado? ¿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
lugar de documentos anidados. Tal vez eso es para almacenarlo por separado?