棘手的 mongodb 查询问题:我有一个集合“帐户”,其中包含一堆文档(经过简化并用实际数据交换为非真实世界的值)看起来像这样:
{"_id": "<Mongo Binary Data>",
"Roles": {
"D7753879C7020F8ECF947122FA211413": {
"_id": "<Mongo Binary Data>",
"OrgName": "ACME",
"Rolename": "Coyote Liaison",
},
"CFA7722E6799170706E4C5FFF3F01E63": {
"_id": "<Mongo Binary Data>",
"OrgName": "ACME",
"Rolename": "MembershipAdmin",
},
"C7020F8ECF947122FAGIGHFVFF3F7753": {
"_id": "<Mongo Binary Data>",
"OrgName": "Initech",
"Rolename": "MembershipAdmin",
}
}
}
Roles 数组中的键是角色 id 和组织 id 的组合,然后对它们进行哈希处理,这样可以非常快速地查询(一旦从 MongoDB 将 Account 对象加载到 C# 中)来判断 Account 是否具有给定组织的给定角色,即,用户是 Initech 的 MembershipAdmin。
现在我想查询具有任何组织角色的用户,在伪 SQL 中可以表示为“选择所有帐户,这些帐户至少有一个角色对象,其中 Rolename = THISROLENAME”。即,获取所有属于 MembershipAdmins 的用户。
我试过这个:
{
Roles.Rolename: "MembershipAdmin"
}
还有这个
{
Roles: {"Rolename": "MembershipAdmin"}
}
还有这个
{
Roles: {"$elemMatch": {"Rolename": "MembershipAdmin"}}
}
...无济于事并且已经看到了几个答案等,说唯一的出路是将关联数组键向下推到子对象中,我不想这样做,因为它是这个的主要功能数据结构(检查帐户是否具有给定组织的给定角色)确实非常快。我在上面描述的用例不必非常快,因为它是管理员用户责任的一部分,所以我很乐意让他们等待片刻——因此在这种情况下,具有过度递归等的查询是可以的.
有没有人知道如何在不重构数据结构的情况下完成这项工作?我对此束手无策。
非常感谢,
G
[编辑:上面的结构是不可查询的,请参阅公认的答案以获得博学但快速的解释,说明为什么不这样做以及您应该如何正确地解决它。但是,如果您对 hacky 解决方法感到满意,您可以将数据的副本存储在旁边的 BsonArray 中,并使用 $elemMatch 进行查询]