Понимание отношений и внешних ключей в Mongoose
В MongoDB/Mongoose, как мне определить отношения? Я думаю, что есть несколько способов, которые я видел, но я не уверен, что понимаю различия или когда я их использую. Я использую Mongoose 3
Я определил модель Todo
и TodoList
, где отношения очевидны. Итак, следуя документам http://mongoosejs.com/docs/documents.html, я определил такие классы, как:
# 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
Затем я попробовал тестировать классы:
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
Когда я пытаюсь сделать Todo.find()
, я ничего не получаю, поэтому модель (Todo.coffee
) является излишней? Похоже, что Todo
хранится в TodoList
, как пользователь, которого может не волновать, но мне интересно, какие последствия? Например. будет ли документ слишком большим? 1 TodoList со слишком большим количеством Todos? Это имеет значение? Что делать, если я разрешаю вложенные Todos (не то, что я хочу сделать это просто для понимания), лучше ли хранить документы отдельно? Как мне это сделать, если я так желаю, и когда я это сделаю?
Я видел другой метод, в Mongoose 2 фактически, dunno, если его возможно в 3, что-то вроде использования ObjectId
вместо вложенных документов. Может быть, это сохранить его отдельно?
Ответы
Ответ 1
Я все еще новичок в Node, Mongoose и Mongo, но я думаю, что я могу решить хотя бы часть вашего вопроса.:)
Ваш текущий метод такой же, как я и делал сначала. В принципе, это заканчивает тем, что хранит его очень похоже на это (написано в JS, так как я не знаю CoffeeScript):
var todoListSchema = new mongoose.Schema({
name: String,
todos: [{
name: String,
desc: String,
dueOn: Date,
completedOn: Date
}]
});
Позже я нашел этот метод, которого я искал, и я думаю, что вы намеревались:
var todoListSchema = new mongoose.Schema({
name: String,
todos: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Todo' //Edit: I'd put the schema. Silly me.
}]
});
Здесь хранится массив ObjectIds, который вы можете загрузить с помощью Query#populate
в Mongoose.
Я не знаю о технических последствиях, но это имеет больше смысла в моем мозгу, если я держу их раздельными, так что я делаю.:)
Изменить: Вот некоторые официальные документы, которые могут быть полезны: http://mongoosejs.com/docs/populate.html