problème d'interrogation difficile mongodb: J'ai une collection 'Comptes' avec un tas de documents qui (simplifié et avec des données réelles échangées pour non-monde réel valeurs) ressemblent à ceci:Requête Mongodb pour les documents qui ont des sous-objets avec une certaine valeur elem dans un tableau associatif
{"_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",
}
}
}
les clés du tableau de rôles sont une combinaison d'un identifiant de rôle et un identifiant org qui sont ensuite haché, ce qui le rend très rapide à interroger (une fois un objet de compte a été chargé de MongoDB et en C#) pour si un compte a un rôle donné pour une organisation donnée, c'est-à-dire, est un utilisateur MembershipAdmin pour Initech.
Maintenant, je veux interroger les utilisateurs qui ont un rôle pour ANY org, qui en pseudo-SQL pourrait être exprimé comme «SELECT tous les comptes qui ont au moins un objet de rôle où Rolename = THISROLENAME». C'est à dire, obtenir tous les utilisateurs qui sont MembershipAdmins.
J'ai essayé:
{
Roles.Rolename: "MembershipAdmin"
}
et ce
{
Roles: {"Rolename": "MembershipAdmin"}
}
et ce
{
Roles: {"$elemMatch": {"Rolename": "MembershipAdmin"}}
}
... en vain et ont vu plusieurs réponses, etc., en disant que le seul moyen de sortir de cela est de pousser la clé de tableau associatif dans les sous-objets, ce que je ne veux pas faire car il fait le primaire fonction de cette structure de données (vérifier si un compte a un rôle donné pour une organisation donnée) très rapidement. Le cas d'utilisation que je décris ci-dessus ne doit pas être méga-rapide car il fait partie de la responsabilité d'un utilisateur admin, je suis donc heureux de les faire patienter quelques instants - donc les requêtes avec une récursivité excessive, etc. .
Est-ce que quelqu'un a des idées pour faire ce travail sans refactoriser la structure de données? À la fin de mon esprit avec ceci.
Un grand merci,
G
[EDIT: la structure ci-dessus est interrogeable pas, voir la réponse acceptée pour une explication érudite mais rapide à pourquoi et ce que vous devez bien faire pour y remédier . Si vous êtes OK avec une solution de contournement hacky, cependant, vous pouvez stocker une copie des données dans un BsonArray à côté et interroger à l'aide de $ elemMatch]
J'avais peur que cette approche soit la seule réponse. Merci pour la clarification et le raisonnement derrière cela. – dartacus
En tant qu'addendum, la structure dans la question est ce que vous finissez avec si vous utilisez un Dictionary dans votre classe C# sous-jacente pour gérer des données comme celle-ci. Cela a du sens au niveau de l'application, même si ce n'est pas une structure pratique quand elle devient un schéma mongo. –
dartacus
Pour l'enregistrement, en tant que solution provisoire, j'ai adapté la méthode save de ma classe de compte pour copier les données clés du dictionnaire des rôles et les stocker dans un BsonArray appelé MiniRoles. Vous pouvez ensuite l'interroger avec { MiniRoles: {$ elemMatch: {"Rolename": "MembershipAdmin"}} } Ce n'est pas une solution idéale, évidemment, mais va me dépanner jusqu'à ce que je refactor mes classes. – dartacus