我有大约200 000个对象名称,20个角色和500个用户。 角色分类为admin,domain1,domain2,domain3,domain4..domain 20
某些角色(domain1,domain4)只能访问5个对象名称,而其他一些角色可以访问500-20000个对象名称。 管理员角色可以访问所有对象(200万)。所以我要映射管理员角色下的所有对象。 所以我的数据模型如下所示。
{_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}
}
在这个模型中,我们面临着缓慢的查询响应。有些域只能访问很少的对象名称,但需要很多嵌入式循环来识别对象。我们已经在集合上需要索引
答案 0 :(得分:0)
以下是一些可能有用的建议。
首先,如您所示,将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_roles
和applicable_objects
既不是对象也不是数组。错字?)
第三次,利用 indexes 。通过在applicable_roles
数组上添加索引,您将看到改进的性能。
db.yourcollection.createIndex({ applicable_roles : 1 })
(如果您将applicable_roles
作为对象而不是数组,则每个行的applicable_roles
对象架构将有所不同,因为我假设对象键是角色名称。这种格式会阻止您在applicable_roles
字段上拥有完全有用的索引,因为该字段的对象架构在各行之间不一致。)