【问题标题】:Understanding Relationships & Foreign Keys in Mongoose了解 Mongoose 中的关系和外键
【发布时间】:2012-08-08 08:57:36
【问题描述】:

在 MongoDB/Mongoose 中,如何定义关系?我认为我见过几种方法,但我不确定我是否理解差异或何时使用哪种方法。我正在使用 Mongoose 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 待办事项过多的待办事项列表?这有关系吗?如果我允许嵌套的 Todos 怎么办(不是我想这样做只是为了理解),那么单独存储文档会更好吗?如果我愿意,我该怎么做?我什么时候做?

我实际上在 Mongoose 2 中看到了另一种方法。我不知道,在 3 中是否有可能。比如使用 ObjectId 而不是嵌套文档。也许那是分开存放?

【问题讨论】:

    标签: mongodb join foreign-keys mongoose


    【解决方案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.
        }]
    });
    

    这存储了一个 ObjectId 数组,然后您可以在 Mongoose 中使用 Query#populate 加载该数组。

    我不知道技术含义,但如果我将它们分开,在我的大脑中会更有意义,所以这就是我正在做的事情。 :)

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

    【讨论】:

    • Schema.Types.ObjectId 有一个 v2 兼容版本:Schema.ObjectId;这让我困惑了一段时间
    • 如果我在 Todo Schema 中使用的 ID 不是 ObjectId,而是显式的 uuid/v1。那么这对我在 todoListSchema 中的类型有什么影响呢?我可以说类型是字符串吗?
    猜你喜欢
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2018-01-10
    相关资源
    最近更新 更多