2012-01-05 92 views
3

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

回答

5

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

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

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

如何创建新任务并将其关联到用户? – chovy 2012-09-28 19:40:21

+0

'var newTask = new Task({....,user:user._id}); newTask.save(savedTask);''' – staackuser2 2012-09-28 22:59:23

4

为了详细说明emostar的回答是:

您正在尝试使用MongoDB的像关系数据库。您向用户提供任务列表,但每个任务都参考用户。在一个典型的MongoDB模式中,你会弄清楚你想如何在你的应用中使用模型,并将文档嵌入到合理的位置(例如,如果用户包含任务数组,则不需要任何引用对它的所有者 - 只要看看拥有该集合的用户)。