【问题标题】:MongooseJS schema relationMongooseJS 模式关系
【发布时间】:2012-02-03 00:07:01
【问题描述】:

我的 MongooseJS 架构如下:

var UserSchema = new Schema({
    name            : String,
    app_key         : String,
    app_secret      : String,
    tasks           : [{ type   : Schema.ObjectId, 
                            ref : 'Task'}]
})

var ActionSchema = new Schema({
    name            : String,
    description     : String,
    module          : String
})

var enumTaskState = ['New', 'Indexing', 'Idle', 'In Queue', 'Working'];
var TaskSchema = new Schema({
    name            : String,
    lastPerformed   : Date,
    folder          : String,
    actions         : [{type    : Schema.ObjectId, 
                        ref     : 'Task'}],
    user            : { type    : Schema.ObjectId, 
                        ref     : 'User'},
    status          : { type    : String,
                        enum    : enumTaskState,
                        default : 'New'}
})

问题是,当我设置一个任务的用户时,我是否必须手动转到该用户并在那里添加一个任务?这似乎是额外的工作(冗余),mongoosejs 中是否有一个选项可以让我指定它将自行处理所有事情的关系? 谢谢。

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    MongoDB 不是关系型数据库,它是基于文档的数据库。

    您可以通过查询 TaskSchema 并查找您想要的用户来获取用户的任务列表。只需确保添加一个索引,这样它就会是一个快速查询:

    user: {type: Schema.ObjectId, ref: 'User', index: true}
    

    【讨论】:

    • 如何创建新任务并关联到用户?
    【解决方案2】:

    详细说明 emostar 的回答:

    您正在尝试像使用关系数据库一样使用 MongoDB。您为用户提供了一个任务列表,但每个任务都引用了一个用户。在典型的 MongoDB 模式中,您会弄清楚您想如何在应用程序中使用模型,然后将文档嵌入到有意义的位置(例如,如果用户包含任务数组,则任务不需要引用给它的所有者——只需查看拥有该集合的用户)。

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      相关资源
      最近更新 更多