了解在猫鼬的关系和外键(Understanding Relationships & Foreign

2019-07-30 21:39发布

在MongoDB中/猫鼬,我怎么定义一个关系? 我觉得有我已经看到了一些办法,但我不知道我理解的差异还是当我使用它。 我使用的猫鼬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 )是一种多余的? 它看起来像Todo存储在TodoList ,因为我可能不关心用户,但我不知道会造成什么影响? 例如。 将文件得到过大? 1个TodoList的太多托多斯? 请问是怎么回事? 如果我允许嵌套托多斯(不,我想要做的ITM只是为了理解),是它更好地存储文档分开呢? 我该怎么办,如果我愿意的话,当我该怎么办呢?

我看到了另一种方法,在猫鼬2实际上,在3,如果可能不知道,像使用ObjectId嵌套文档代替。 也许这就是要分开​​存放?

Answer 1:

我还是新的节点,猫鼬,和蒙戈,但我想我可以解决你的问题的至少一部分。 :)

您当前的方法是一样的,因为我最初试图做的事情。 基本上,它结束了非常相似存放到这个(写在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.
    }]
});

此存储的ObjectID的阵列,然后可以使用加载Query#populate在猫鼬。

我不知道的技术含义,但它使我的大脑更有意义,如果我把它们分开,所以这是我在做什么。 :)

编辑:这是一些官方的文档可能有用: http://mongoosejs.com/docs/populate.html



文章来源: Understanding Relationships & Foreign Keys in Mongoose