MongooseJS架构关系

时间:2012-01-05 04:59:17

标签: javascript node.js mongodb mongoose

我有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中是否有一个选项可以让我指定它将自己处理所有事物的关系? 感谢。

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:4)

详细阐述emostar的答案:

您正在尝试像关系数据库一样使用MongoDB。您正在为用户提供任务列表,但每个任务都引用一个用户。在典型的MongoDB架构中,您将弄清楚如何在应用程序中使用模型,并将文档嵌入有意义的位置(例如,如果用户包含任务数组,则无需任务来获取参考它的所有者 - 只需看看拥有该系列的用户。)