2012-08-11 17 views
19

MongoDB/Mongooseでは、関係をどのように定義しますか?私は見たことがいくつかあると思いますが、その違いを理解していないか、いつどのようなものを使うのか分かりません。私はモンゴース3を使用していますMongooseの関係と外部キーの理解

私はTodoTodoListモデルを定義しました。その関係は明らかです。私はTodo.find()をしようとすると、私は何を取得

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.coffee):その後、私はクラスをテストしようとした

# 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 

:だからドキュメントhttp://mongoosejs.com/docs/documents.html以下、私のようなクラスを定義しました冗長ですか?それはTodoのように私は気にしないかもしれないユーザーとして、TodoListに格納されているようだが、私は何を意味するのだろうか?例えば。ドキュメントが大きくなりすぎますか? 1 Todoリストが多すぎますか?それは重要ですか?もし私が入れ子になっているTodosを許可すれば(私はそれを理解したいとは思っていません)、文書を別々に保管するほうがいいですか?もし私が望むなら、それをどうすればできますか?それはいつしますか?

私はMongoose 2では実際には3で可能な場合は別の方法を見ました。ネストされたドキュメントの代わりにObjectIdを使用するようなものです。別にそれを保管することはありますか?

答えて

34

私はノード、モンゴース、モンゴーではまだ新しいですが、あなたの質問の少なくとも一部に対処できると思います。 :)

あなたの現在の方法は、私が最初にやったのと同じです。 (私はCoffeeScriptのを知らないので、JSで書かれた)基本的には、これに非常によく似た、それを格納終わる:

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

これは、あなたが、その後マングースでQuery#populateを使用してロードすることができたObjectIdの配列を、保存します。

私は技術的な意味合いはわかりませんが、別々にしておけばそれは私の脳には意味があります。 :)

編集:http://mongoosejs.com/docs/populate.html

+4

Schema.Types.ObjectIdはv2の互換バージョンがあります:ここでは役に立つかもしれないいくつかの公式ドキュメントでSchema.ObjectId。これは私がしばらく混乱していた –

関連する問題