【问题标题】:How to simplify mongodb collection?如何简化 mongodb 收集?
【发布时间】:2013-02-19 03:43:37
【问题描述】:

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

现在,如果资源或团队发生更改,我希望跳过多次更新,因此我没有使用嵌套文档。我无法从 Teams 架构中获得 ref Resources 架构。结果,要获得以下结果,我必须通过非常复杂的聚合函数。

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

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

【问题讨论】:

    标签: javascript mongodb mongoose


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      如果这没有带来 teams.resources 填充(我怀疑,因为猫鼬非常灵活),请尝试以下操作:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-30
        • 2021-12-15
        • 2019-01-20
        • 2022-11-06
        • 2012-03-30
        • 2017-10-29
        相关资源
        最近更新 更多