2012-08-11 2 views
19

MongoDB/Mongoose에서 관계를 어떻게 정의합니까? 내가 본 몇 가지 방법이 있다고 생각하지만 차이점을 이해할 수 있는지, 언제 어느 것을 사용해야하는지 잘 모르겠습니다. 나는 몽구스 3를 사용하고있다몽구스의 관계 및 외래 키 이해

TodoTodoList 모델을 정의했다. 관계는 명백하다. 그래서 문서 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) 여분의 일종인가요? TodoTodoList에 저장되어있는 것처럼 보이는데, 사용자가 신경 쓰지 않을 수도 있지만 그 의미는 무엇입니까? 예 : 문서가 너무 커질 것인가? Todo 목록이 너무 많습니다. 그게 중요합니까? 내가 중첩 된 Todos를 허용한다면 (이해를 돕기 위해서가 아니라), 별도로 문서를 저장하는 것이 더 나은가? 내가 그렇게 원한다면 나는 어떻게해야합니까? 언제 제가 그것을합니까?

Mongoose 2에서 다른 방법을 실제로 보았습니다. 3이 가능하다면 중첩 된 doc 대신 ObjectId을 사용하는 것과 같습니다. 별도로 보관해야할까요?

답변

34

저는 Node, Mongoose 및 Mongo를 아직 처음 사용하고 있지만 귀하의 질문 중 적어도 일부는 해결할 수 있다고 생각합니다. :)

현재의 방법은 처음에 시도한 것과 같습니다. 기본적으로, (나는 커피 스크립트를 알 수 없기 때문에, 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를 사용하여로드 할 수 있습니다하며 Object의 배열을 저장합니다.

나는 기술적 인 의미는 모르지만 나는 그것들을 분리하여 보관하면 뇌에 더 의미가있다. 그래서 그것이 내가하는 일이다. :)

편집 : http://mongoosejs.com/docs/populate.html

+4

Schema.Types.ObjectId는 V2 호환 버전이 있습니다 : 여기에 도움이 될 수있는 몇 가지 공식 문서입니다 Schema.ObjectId; 이것은 나를 당황하게했다. –