MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment créer des requêtes imbriquées dans MongoDb qui fonctionnent comme des requêtes de sélection Sql imbriquées

La réponse à de telles questions dans MongoDB est souvent de dénormaliser vos données. Si vous n'avez besoin que d'une liste des utilisateurs du groupe, vous pouvez stocker l'identifiant d'utilisateur et le nom d'utilisateur dans le document de groupe. D'une certaine manière, vous structurez votre base de données en fonction du résultat que vous souhaitez voir à l'écran plutôt que d'essayer de le mettre dans un format normalisé.

Il est clair que cela ne fonctionnerait que si votre liste de groupes d'utilisateurs (avec des noms) peut tenir dans un seul document, mais votre approche actuelle présente également certaines limites concernant la taille maximale d'un groupe.

Une autre approche consisterait à stocker les groupes auxquels appartient un utilisateur dans un tableau sur chaque document "Utilisateur". Ajoutez un index sur ce champ de tableau et vous pouvez maintenant trouver des utilisateurs par groupe. Étant donné qu'un utilisateur est susceptible d'appartenir à moins de groupes qu'il n'y a de membres dans un groupe, cela peut être la meilleure approche ici.

db.user.save({_id:"u1", name:"u1 name", groups:[{_id:"g1", name:"Group One"}, ...]});

Encore une fois, vous pouvez stocker le nom du groupe avec son _id afin de pouvoir afficher immédiatement la liste des groupes auxquels appartient un utilisateur en un seul aller-retour. Bien sûr, si vous autorisez le changement d'un nom de groupe, vous devrez lancer une tâche en arrière-plan pour réparer toutes ces copies du nom.

J'utiliserais également le générateur d'identifiant MongoDB intégré plutôt que le vôtre, il possède de nombreuses propriétés souhaitables.