2012-08-11 15 views
19

W MongoDB/Mongoose, jak zdefiniować związek? Sądzę, że jest kilka sposobów, które widziałem, ale nie jestem pewien, czy rozumiem różnice lub kiedy ich używam. Używam Mongoose 3Zrozumienie związków i zagranicznych kluczy w Mongoose

Mam zdefiniowany model Todo i TodoList, gdzie związek jest oczywisty. Więc po docs http://mongoosejs.com/docs/documents.html, mam określone zajęcia jak:

# 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 

Potem próbowałem testowania klas:

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 

Kiedy próbuję zrobić Todo.find() dostaję nic, więc modelu (Todo.coffee) jest trochę zbędny? Wygląda na to, że Todo są przechowywane w TodoList, jako użytkownik może mnie to nie obchodzi, ale zastanawiam się, jakie są implikacje? Na przykład. czy dokument stanie się zbyt duży? 1 TodoList ze zbyt dużą ilością Todos? Czy to ma znaczenie? Co się stanie, jeśli zgodzę się na zagnieżdżone Todos (nie, że chcę to zrobić tylko dla zrozumienia), czy lepiej jest przechowywać dokumenty oddzielnie? Jak mam to zrobić, jeśli tak sobie życzę i kiedy to zrobię?

Widziałem inną metodę, w Mongoose 2 w rzeczywistości, nie wiem, czy jest to możliwe w 3, coś w rodzaju korzystania z ObjectId zamiast zagnieżdżonych dokumentów. Może to przechowywać osobno?

Odpowiedz

34

Wciąż jestem nowy w Node, Mongoose i Mongo, ale myślę, że mogę odpowiedzieć na przynajmniej część twojego pytania. :)

Twoja obecna metoda jest taka sama, jak próbowałem na początku. Zasadniczo, to kończy się przechowywanie go bardzo podobnie do tego (napisany w JS, ponieważ nie wiem coffeescript):

var todoListSchema = new mongoose.Schema({ 
    name: String, 
    todos: [{ 
     name: String, 
     desc: String, 
     dueOn: Date, 
     completedOn: Date 
    }] 
}); 

I później okazało tę metodę, która jest co szukałem, i myślę, co pan zamierza:

var todoListSchema = new mongoose.Schema({ 
    name: String, 
    todos: [{ 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'Todo' //Edit: I'd put the schema. Silly me. 
    }] 
}); 

ten przechowuje tablicę ObjectIds, które można następnie wczytać za pomocą Query#populate w Mongoose.

Nie znam technicznych implikacji, ale w moim mózgu ma to więcej sensu, jeśli trzymam je oddzielnie, więc to właśnie robię. :)

Edycja: Oto niektóre oficjalne docs, które mogą być użyteczne: http://mongoosejs.com/docs/populate.html

+4

Schema.Types.ObjectId ma wersję kompatybilności v2: Schema.ObjectId; przez chwilę miałem w tym zamieszanie –

Powiązane problemy