使用现有数据重新设计MongoDB模式



我有大约200000个对象名称和20个角色和500个用户。角色分为admin、domain1、domain2、domain3、domain4..域20

某些角色(domain1,domain4)只能访问5个对象名,而其他角色可以访问500- 20,000个对象名。Admin角色可以访问所有对象(200万)。我需要映射admin角色下的所有对象。所以我的数据模型是这样的,

    {_id:1,
    Role_name: "admin"
    access_objects :{name1,name2 ..........name2000000}
   },
   {_id:2,
    Role_name: "domain1"
    access_objects :{name1,name2 ..........name5}
   },
   {_id:3,
    Role_name: "domain3"
    access_objects :{name1,name2 ..........name500}
   }
   ..
   {_id:5,
    Role_name: "domain5"
    access_objects :{name1,name2 ..........name5000}
   }

这里是mongodb文档16mb限制问题来了。我无法在嵌入式文档中存储200万个对象名称,如上面所示的admin。

因此,我们没有将对象名称映射到角色,而是将角色映射到每个操作。我目前的收藏设计如下:

{_id:1,
    object_name: "object_name1"
    applicable_roles :{admin,domain1,domain2,domain3,domain4,domain5}
   },
   {_id:2,
    object_name: "object_name2"
    applicable_roles :{admin,domain1,domain5}
   },
   {_id:3,
    object_name: "object_name3"
    applicable_roles :{domain4}
   }
   ..
   {_id:2000000,
    object_name: "object_name2000000"
    applicable_roles :{domain4,domain1}
   }

在这个模型中,我们面临着查询响应缓慢的问题。有些领域只访问几个对象名称,但需要大量的嵌入式循环来识别对象。我们已经在集合

上设置了索引

以下是一些可能会有所帮助的建议。


如您所演示的,首先applicable_roles映射到object_name,因为对象名称的数量要比适用的角色大得多。

// Do this:
{
    _id:1,
    object_name: "object_name1"
    applicable_roles :{admin,domain1,domain2,domain3,domain4,domain5}
}
// Instead of:
{
    _id:1,
    role: "admin"
    applicable_objects: {object1, ...., object200000}
}

第二,使用一个数组作为元素类型来保存你的applicable_roles(不是一个对象的角色名称作为属性键)。如下所示,applicable_roles现在位于数组中。

{
    _id:1,
    object_name: "object_name1"
    applicable_roles :[ admin,domain1,domain2,domain3,domain4,domain5 ]
}

(顺便说一下,applicable_rolesapplicable_objects在你的帖子中既不是对象也不是数组。错字?)


第三,利用索引。通过在applicable_roles数组上添加索引,您将看到性能的提高。

db.yourcollection.createIndex({ applicable_roles : 1 })

(如果您将applicable_roles作为对象而不是数组,那么您的applicable_roles对象模式对于每一行将是不同的,因为我假设,对象键是角色名称。这种格式会使您无法在applicable_roles字段上拥有一个完全有用的索引,因为该字段的对象模式在各行之间是不一致的。

最新更新