MongooseJS架构关系

MongooseJS schema relation

本文关键字:关系 MongooseJS      更新时间:2023-09-26

我有如下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中有没有一个选项可以让我指定它将自己处理所有事情的关系?谢谢

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

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

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

详细说明emostar的答案:

您正试图像使用关系数据库一样使用MongoDB。您向用户提供了一个任务列表,但每个任务都引用了一个用户。在一个典型的MongoDB模式中,你会弄清楚如何在应用程序中使用模型,并将文档嵌入到有意义的地方(例如,如果用户包含一组任务,则任务不需要引用其所有者——只需查看拥有集合的用户即可)。