2012-08-11 55 views
19

在MongoDB/Mongoose中,如何定義關係?我認爲我已經看到了幾種方法,但我不確定我是否理解差異或什麼時候使用哪種方法。我正在使用貓鼬3瞭解Mongoose中的關係和外鍵

我已經定義了TodoTodoList模型,其中關係很明顯。

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):所以文檔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 

然後我試圖測試類有點多餘?它看起來像Todo存儲在TodoList,作爲我可能不在乎的用戶,但我不知道有什麼影響?例如。文件會變得太大嗎? 1 TodoList有太多Todos?這很重要嗎?如果我允許嵌套的Todos(不是我想爲了理解而這樣做),那麼單獨存儲文檔會更好嗎?我該如何做,如果我願意,我什麼時候做?

我看到了另外一種方法,實際上在Mongoose 2中,不知道它是否可能在3中,例如使用ObjectId而不是嵌套文檔。也許這是分開存儲它?

回答

34

我還是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. 
    }] 
}); 

此存儲的ObjectID,然後可以加載貓鼬使用Query#populate的陣列。

我不知道技術含義,但是如果我將它們分開,我的腦中會更有意義,這就是我正在做的。 :)

編輯:這是一些官方的文檔可能有用:http://mongoosejs.com/docs/populate.html

+4

Schema.Types.ObjectId具有V2兼容版本:Schema.ObjectId;這讓我感到困惑了一陣子 – 2013-05-31 18:42:18