2012-01-05 42 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模式中,你會弄清楚你想如何在你的應用中使用模型,並將文檔嵌入到合理的位置(例如,如果用戶包含任務數組,則不需要任何引用對它的所有者 - 只要看看擁有該集合的用戶)。