20

MongoDB / 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が、ユーザーとしては気にしないかもしれませんが、どのような影響があるのでしょうか。例えば。ドキュメントが大きくなりすぎますか?Todoが多すぎる1つのTodoList?それは重要ですか?ネストされたTodoを許可した場合(理解のためだけにそれを実行したいわけではありません)、ドキュメントを個別に保存する方がよいでしょうか?私がそう望むなら、どうすればそれを行うことができますか、そしていつそれをしますか?

私は実際にマングース2で別の方法を見ました。3.で可能かどうかはわかりませんObjectId。ネストされたドキュメントの代わりに使用するようなものです。多分それはそれを別々に保存することですか?

4

1 に答える 1

38

私はまだNode、Mongoose、Mongoを初めて使用しますが、少なくともあなたの質問の一部に対処できると思います。:)

あなたの現在の方法は、私が最初に試したのと同じです。基本的に、これと非常によく似た形で保存されます(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.
    }]
});

これにより、ObjectIdの配列が格納Query#populateされ、Mongooseで使用してロードできます。

技術的な意味はわかりませんが、脳内で分離しておく方が理にかなっているので、それをやっています。:)

編集:ここに役立つかもしれないいくつかの公式ドキュメントがあります:http://mongoosejs.com/docs/populate.html

于 2012-08-12T07:19:29.383 に答える