Comment faire des requêtes imbriquées dans MongoDb qui fonctionne comme imbriquée Sql les requêtes select
Je veux faire un efficace requête dans MongoDb pour trouver tous les utilisateurs qui ont leurs identifiants figurant dans un groupe d'utilisateurs. Idéalement, je veux en faire une seule demande pour Mongodb.
Ce que je veux correspond à imbriqués sélectionne dans SQL.
J'ai essayé ceci dans le shell mongo:
db.user.save({_id:"u1", Name:"u1 name"});
db.user.save({_id:"u2", Name:"u1 name"});
db.user.save({_id:"u3", Name:"u3 name"});
db.usergroup.save({_id:"g1", Users: ["u2","u3"]});
Voici maintenant le sélectionnez je veux faire, mais sans le coder en dur l' ["u2","u3"] tableau:
db.user.find({_id:{$in:["u2","u3"]}}).forEach(printjson);
Cela fonctionne bien et ramène l'utilisateur des objets pour u2 et u3.
Maintenant, la question est de savoir comment obtenir le tableau des identifiants dans le $dans l'opérateur extrait avec une requête telle que l'intégralité de la requête peut être faite avec une seule requête.
Une "requête imbriquée" comme cela ne fonctionne pas:
db.user.find({_id:{$in:db.usergroup.find({_id:"g1"},{_id:0,Users:1})}}).forEach(printjson);
Donne cette erreur:
Mar Mar 27 06:17:41 uncaught exception: erreur: { "$err" : "requête invalide", "code" : 12580 }
échec du chargement: mongoNestedSelect.js
1) est-ce possible dans mongodb et comment ?
2) comment faire cela avec l'officiel c# pilote ?
OriginalL'auteur ssn | 2012-03-27
Vous devez vous connecter pour publier un commentaire.
La réponse à ces questions dans MongoDB est souvent à éliminer vos données. Si vous avez besoin simplement d'une liste des utilisateurs dans le groupe, vous pouvez stocker l'Id de l'utilisateur et le Nom d'utilisateur dans le document du groupe. À certains égards, la structure de votre base de données selon le résultat que vous voulez voir sur l'écran plutôt que d'essayer de le mettre dans certains format normalisé.
Clairement que ne fonctionne que si votre groupe d'utilisateurs de la liste (avec les noms) qui peuvent tenir dans un seul document, mais votre approche actuelle a certaines limitations concernant la taille maximale d'un groupe.
Une autre approche serait de stocker les groupes auxquels appartient un utilisateur dans un tableau sur chaque "Utilisateur" du document. Ajouter un index sur ce tableau de champ et maintenant, vous pouvez rechercher des utilisateurs par groupe. Étant donné que l'utilisateur est susceptible d'appartenir à des groupes moins qu'il y a de membres dans un groupe, cela peut être la meilleure approche ici.
De nouveau, vous peut stocker le nom du groupe avec ses _id de sorte que vous pouvez immédiatement afficher la liste des groupes auxquels appartient un utilisateur avec un seul aller-retour. Bien entendu, si vous laissez un nom de groupe pour modifier vous aurez le coup d'envoi d'une tâche d'arrière-plan pour aller de corriger toutes les copies de ce nom.
Je voudrais aussi utiliser le construit en MongoDB id générateur plutôt que de votre propre, il a de nombreuses propriétés convoitées.
À droite, pas de requêtes imbriquées, vos données doivent être structurées de sorte que vous pouvez obtenir ce que vous voulez avec un seul (ou un minimum) de requêtes à la base de données.
OriginalL'auteur Ian Mercer
définir la fonction
fonction execute
OriginalL'auteur pippo
Si il peut les déclencher pour vous sna--
OriginalL'auteur Markrings
-sUReN
Requête SQL: (groupe par & nombre de distinct)
Équivalent mongo requête devrait ressembler à ceci:
OriginalL'auteur Surendranath Reddy K