如何简化mongodb集合?

时间:2013-02-18 15:39:02

标签: javascript mongodb mongoose

我有一个名为Org的集合,其中包含资源(Resources架构),这些资源在团队之间共享(Teams架构)

{
   "_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")]
}

现在我想在资源或团队发生变化时跳过多次更新,所以我没有使用嵌套文档。我无法从ref架构Resources Teams架构。因此,为了获得以下结果,我必须经历非常复杂的聚合功能。

{   
    "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设计中做错了。有没有更简单的方法?

2 个答案:

答案 0 :(得分:3)

  

现在我想在资源或团队发生变化时跳过多次更新,所以我没有使用嵌套文档。

您会发现这是MongoDB架构设计中需要考虑的常见权衡。实际上,它将归结为您跳过多个更新的重要性。通常,多个更新并不像您想象的那样具有挑战性,并且最终会成为正确的决策,尤其是在需要阅读简单性和性能时。

  

有人可以建议我是否在db设计中做错了。有没有更简单的方法?

鉴于您声明的避免多次更新的意图,我不认为您的方法存在问题。就个人而言,在这种情况下,我会采用嵌套文档方法,并尝试解决多个更新。这将意味着更简单的查询,同时具有更好的性能(这通常是应用程序开发中最重要的考虑因素)。

答案 1 :(得分:0)

在猫鼬中,您可以简单地执行以下操作:

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

如果这不会使teams.resources填充(我怀疑,因为猫鼬非常灵活),请尝试这样做:

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

此外,请不要忘记在ref架构的teams属性中添加People