2013-02-18 72 views
1

我有一個名爲Org集合包含資源(Resources架構),這是團隊之間共享(Teams模式)如何簡化mongodb集合?

{ 
    "_id": ObjectId("511cfbc9d593e5290c000005"), 
    "name": "Some org name", 
    "resources": [ 
     { 
      "_id": ObjectId("511cfbc9d593e5290c000007"), 
      "name": "Printer1", 
      /* mongoose.Schema.Types.Mixed */ 
      "details": { 
       "ip": "192.168.1.99" 
      } 
     }, { 
      "_id": ObjectId("511cfbc9d593e5290c000008") 
      "name": "Fax1", 
      "details": { 
       "number": "XXXXXXXXXXXX" 
      } 
     } 
    ], 
    "teams" : [ 
     { 
      "_id": ObjectId("511cfbc9d593e5290c000012"), 
      "name": "sales", 
      /*"resources": {type: [mongoose.Schema.Types.ObjectId], ref: 'Resources'}*/ 
      "resources": [ObjectId("511cfbc9d593e5290c000007")] 
     }, { 
      "_id": ObjectId("511cfbc9d593e5290c000006"), 
      "name": "developer", 
      "resources": [ObjectId("511cfbc9d593e5290c000007"), ObjectId("511cfbc9d593e5290c000008")] 
     } 
    ]  
} 

也有一個People集合,這是一個團隊的一部分。

{ 
    "name": "Peter", 
    "designation": "senior s/w engg.", 
    "contact": {} 
    /*"teams": {type: [mongoose.Schema.Types.ObjectId], ref: 'Teams'}*/ 
    "teams": [ObjectId("511cfbc9d593e5290c000006")] 
} 

現在我想跳過多個更新,如果資源或團隊被更改,所以我沒有使用嵌套文件。我無法從Teams架構中獲得refResources架構。因此,爲了得到以下結果,我必須經歷非常複雜的聚合函數。

{ 
    "name": "Peter", 
    "designation": "senior s/w engg.", 
    "contact": {} 
    "teams": [{ 
       "_id": ObjectId("511cfbc9d593e5290c000006"), 
       "name": "developer", 
       "resources": [{ 
        "_id": ObjectId("511cfbc9d593e5290c000007"), 
        "name": "Printer1", 
        "details": { 
         "ip": "192.168.1.99" 
        } 
       }, { 
        "_id": ObjectId("511cfbc9d593e5290c000008") 
        "name": "Fax1", 
        "details": { 
         "number": "XXXXXXXXXXXX" 
        } 
       }]    
    }] 
} 

可以請一些建議,如果我在db設計中做錯了什麼。有沒有更簡單的方法?

回答

3

現在我想跳過多個更新如果資源或團隊被改變,所以我沒有使用嵌套的文件。

在MongoDB模式設計中,您會發現這是一個常見的折衷方案。真的,它會歸結爲你跳過多個更新是多麼重要。通常多個更新不像您想象的那麼具有挑戰性,並且最終成爲正確的決策,尤其是當需要閱讀簡單性和性能時。

有些人可以請建議,如果我在db設計中做錯了什麼。有沒有更簡單的方法?

我不認爲你的方法是有問題的,因爲你所說的避免多次更新的意圖。就個人而言,在這種情況下,我會使用嵌套文檔方法並嘗試解決多個更新。這將意味着更簡單的查詢,並具有更好的性能(這往往是應用程序開發中最重要的考慮因素)。

0

在貓鼬,你可以簡單地做到以下幾點:

People.find({ name: "Peter" }).populate("teams").exec(callback); 

如果不把人口teams.resources(我懷疑,因爲貓鼬是非常靈活的),試試這個來代替:

People.find({ name: "Peter" }) 
    .populate("teams") 
    .populate("teams.resources") 
    .exec(callback); 

此外,不要忘記在您的People模式的teams屬性中添加ref