Подтвердить что ты не робот

Понимание отношений и внешних ключей в Mongoose

В MongoDB/Mongoose, как мне определить отношения? Я думаю, что есть несколько способов, которые я видел, но я не уверен, что понимаю различия или когда я их использую. Я использую 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, как пользователь, которого может не волновать, но мне интересно, какие последствия? Например. будет ли документ слишком большим? 1 TodoList со слишком большим количеством Todos? Это имеет значение? Что делать, если я разрешаю вложенные Todos (не то, что я хочу сделать это просто для понимания), лучше ли хранить документы отдельно? Как мне это сделать, если я так желаю, и когда я это сделаю?

Я видел другой метод, в Mongoose 2 фактически, dunno, если его возможно в 3, что-то вроде использования ObjectId вместо вложенных документов. Может быть, это сохранить его отдельно?

4b9b3361

Ответ 1

Я все еще новичок в Node, Mongoose и Mongo, но я думаю, что я могу решить хотя бы часть вашего вопроса.:)

Ваш текущий метод такой же, как я и делал сначала. В принципе, это заканчивает тем, что хранит его очень похоже на это (написано в JS, так как я не знаю CoffeeScript):

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.
    }]
});

Здесь хранится массив ObjectIds, который вы можете загрузить с помощью Query#populate в Mongoose.

Я не знаю о технических последствиях, но это имеет больше смысла в моем мозгу, если я держу их раздельными, так что я делаю.:)

Изменить: Вот некоторые официальные документы, которые могут быть полезны: http://mongoosejs.com/docs/populate.html