2012-08-11 9 views
19

In MongoDB/Mongoose, wie definiere ich eine Beziehung? Ich denke, es gibt ein paar Wege, die ich gesehen habe, aber ich bin mir nicht sicher, ob ich die Unterschiede verstehe oder wann ich welche verwende. Ich verwende Mungo 3Beziehungen und Fremdschlüssel in Mongoose verstehen

Ich habe definiert Todo und TodoList Modell, wo die Beziehung offensichtlich ist. So nach dem docs http://mongoosejs.com/docs/documents.html, ich habe definierten Klassen wie:

# 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 

Dann habe ich versucht, die Klassen zu testen:

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 

Wenn ich versuche, Todo.find() zu tun, ich habe nichts bekommen, so das Model (Todo.coffee) ist irgendwie überflüssig? Es sieht aus wie Todo sind in TodoList gespeichert, als Benutzer kann mich nicht interessieren, aber ich frage mich, was sind die Auswirkungen? Z.B. Wird das Dokument zu groß? 1 TodoList mit zu vielen Todos? Spielt das eine Rolle? Was ist, wenn ich verschachtelte Todos erlaube (nicht, dass ich es nur zum Verständnis machen möchte), ist es besser, Dokumente getrennt zu speichern? Wie mache ich das, wenn ich es wünsche und wann mache ich es?

Ich sah eine andere Methode, in Mungo 2 tatsächlich, weiß nicht, ob es in 3 möglich ist, etwas wie ObjectId statt verschachtelte Dokumente verwenden. Vielleicht ist das separat zu speichern?

Antwort

34

Ich bin noch neu zu Knoten, Mongoose und Mongo, aber ich denke, ich kann zumindest einen Teil Ihrer Frage ansprechen. :)

Ihre aktuelle Methode ist die gleiche wie ich es zuerst versucht habe. Im Grunde ist es endet es sehr ähnlich wie das Speichern (geschrieben in JS, da ich weiß, Coffeescript nicht wichtig):

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

ich später diese Methode gefunden, das ist das, was ich suchte, und ich denke, was Sie beabsichtigten:

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

Dies speichert eine Reihe von ObjectIDs, die Sie dann mit Query#populate in Mongoose laden können.

Ich kenne die technischen Auswirkungen nicht, aber es macht mehr Sinn in meinem Gehirn, wenn ich sie getrennt halte, also mache ich das. :)

Edit: Hier ist ein einige offizielle Dokumente, die nützlich sein könnten: http://mongoosejs.com/docs/populate.html

+4

Schema.Types.ObjectId hat eine v2 Kompatibilität Version: Schema.ObjectId; Das hat mich für eine Weile verwirrt –

Verwandte Themen