トリッキーな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 の組み合わせであり、ハッシュされます。これにより、アカウントにつまり、Initech の MembershipAdmin であるユーザーです。
ここで、任意の組織のロールを持つユーザーをクエリしたいと考えています。これは、疑似 SQL で「Rolename = THISROLENAME であるロール オブジェクトを少なくとも 1 つ持つすべてのアカウントを選択する」と表現できます。つまり、MembershipAdmins であるすべてのユーザーを取得します。
私はこれを試しました:
{
Roles.Rolename: "MembershipAdmin"
}
この
{
Roles: {"Rolename": "MembershipAdmin"}
}
この
{
Roles: {"$elemMatch": {"Rolename": "MembershipAdmin"}}
}
...役に立たず、いくつかの回答などを見てきました。これを回避する唯一の方法は、連想配列キーをサブオブジェクトに押し込むことです。これは、これの主な機能になるため、やりたくありませんデータ構造(アカウントが特定の組織に対して特定の役割を持っているかどうかを確認する)は非常に迅速です。上記の使用例は、管理者ユーザーの責任の一部であるため、非常に高速である必要はありません。そのため、この場合、再帰が過剰なクエリなどは問題ありません。 .
データ構造をリファクタリングせずにこれを機能させる方法を知っている人はいますか? 思いっきりこれで。
どうもありがとう、
G
[編集: 上記の構造はクエリ可能ではありません。学識者の受け入れられた回答を参照してください。ただし、そうしない理由と、それを修正するために適切に行うべきことについての簡単な説明を参照してください。ただし、ハックな回避策で問題ない場合は、データのコピーを BsonArray に保存し、それに対して $elemMatch を使用してクエリを実行できます]