在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中,如果它可能在3中,则不知道如何使用ObjectId
而不是嵌套文档。也许这是分开存储?
答案 0 :(得分:35)
我还是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数组,然后您可以使用Mongoose中的Query#populate
加载它。
我不知道技术含义,但如果我将它们分开,我的大脑会更有意义,所以这就是我正在做的事情。 :)
编辑:以下是一些可能有用的官方文档:http://mongoosejs.com/docs/populate.html