1

我有一个名为的集合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"
                    }
                 }]              
     }]
}

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

4

2 回答 2

3

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

您会发现这是 MongoDB 模式设计中要考虑的常见权衡。实际上,这将归结为您跳过多个更新的重要性。通常,多次更新并不像您想象的那么具有挑战性,并且被证明是正确的决定,尤其是在需要读取简单性和性能时。

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

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

于 2013-02-18T19:43:37.083 回答
0

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

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

如果这不带来teams.resources人口(我怀疑,因为猫鼬非常灵活),试试这个:

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

另外,不要忘记添加架构refteams属性。People

于 2013-02-18T15:54:46.537 回答