2014-09-20 86 views
0

我對NoSQL的做事方式很陌生,所以請原諒我,如果我只是想這是完全錯誤的(我覺得我是)。具有角色的裁判陣列的貓鼬模式

我的應用程序擁有用戶和組織,用戶必須擁有並屬於具有成員或所有者角色的組織。

目前在我的架構爲我的用戶我有:

機構單位:[{類型:Schema.Types.ObjectId,參考文獻: '組織'}]

和在我的組織架構中,我有:

成員:[{type:Sc hema.Types.ObjectId,參考:「用戶」}]

,但我也想成員或所有者的角色附加到這一點。

這是不是我應該把實際參考莫名其妙地想:

成員:[{類型:Schema.Types.ObjectId,參考: '用戶',作用:字符串}]

或者該角色應該在架構中的其他位置?處理這個問題的正確方法是什麼?或者有更好的方式來對此進行模式化?

一旦我有適當的模式設置,這將有助於舉例說明如何創建一些用戶/組織與這個roled ref。

回答

2

你可以通過一個小的改變來做到這一點。我以同樣的方式將消息存儲在應用程序中(文本和發件人)。

這裏是你能做什麼:

members: [{ 
    role: { 
     type: String 
    }, 
    user: { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'User' 
    } 
    }], 

然後,當你想一個或多個成員添加到一個組織(假定您已經創建了一個組織單獨的用戶):

function addNewMember(org_id, user_id, role) { 
    var member = {role: role, user: user_id}; 
    Organization.findByIdAndUpdate(org_id, {"$push": {"members":member}}, function(err,org) { 
       ... 
      });) 
// you can use the $each clause to add a whole array of members at the same time too 
// like so: 
// {"$push": {"members": 
//    { 
//    "$each": [memberarray] 
//    }}} 

} 

而當你想找到一個組織,包括它的成員,你可以這樣做:

Organization.findById(org_id) 
     .populate('members.user') 
     .exec(callbackfunction); 

仔細想想,您是否確實需要爲成員 - >組織複製組織 - >成員關係。如果這確實很重要,那麼在成功將用戶添加到組織後,在回調中,您可以執行第二個查詢來更新用戶的orgs字段,就像上面一樣。