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?
Schema.Types.ObjectId ma wersję kompatybilności v2: Schema.ObjectId; przez chwilę miałem w tym zamieszanie –