Comment dois-je effectuer la Jointure SQL équivalent dans MongoDB?
Comment dois-je effectuer la Jointure SQL équivalent dans MongoDB?
Par exemple, dire que vous avez deux collections (les utilisateurs et les commentaires) et je tiens à tirer tous les commentaires avec pid=444 avec les infos de l'utilisateur pour chaque.
comments
{ uid:12345, pid:444, comment="blah" }
{ uid:12345, pid:888, comment="asdf" }
{ uid:99999, pid:444, comment="qwer" }
users
{ uid:12345, name:"john" }
{ uid:99999, name:"mia" }
Est-il un moyen pour tirer tous les commentaires avec un certain domaine (par exemple. ...find({pid:444}) ) et l'utilisateur des informations associées à chaque commentaire dans un go?
En ce moment, je suis le premier à obtenir les commentaires qui correspondent à mes critères, puis de déterminer toutes les uid de l'ensemble des résultats, l'obtention de l'utilisateur des objets, et de les fusionner avec le commentaire des résultats. On dirait que je suis de faire le mal.
Correct, $recherche a été introduit dans MongoDB 3.2. Les détails peuvent être trouvés à l'adresse docs.mongodb.org/master/reference/operator/aggregation/lookup/...
je me demande pourquoi ne pas accepter cette réponse ou un commentaire: stackoverflow.com/a/33511166/6941294
OriginalL'auteur The Unknown | 2010-02-28
Vous devez vous connecter pour publier un commentaire.
De Mongo 3.2 les réponses à cette question sont pour la plupart ne sont plus correctes. La nouvelle $opérateur de recherche ajoutés à l'agrégation de pipeline est essentiellement identique à une jointure externe gauche:
https://docs.mongodb.org/master/reference/operator/aggregation/lookup/#pipe._S_lookup
De la documentation:
Bien sûr Mongo est pas une base de données relationnelle, et les devs sont en train d'être prudent de recommander des cas d'utilisation spécifiques pour $recherche, mais à moins de 3,2 faire de jointure est maintenant possible avec MongoDB.
D'accord. C'est la meilleure réponse.
Comment sur plus de deux collections?
seulement ajouter de dollars supplémentaires de recherche les étapes de l'agrégation de pipeline.
Je suis un peu confus au sujet de ce - est-il possible de spécifier que vous souhaitez seulement certains documents dans la collection, ou faut-il rejoindre automatiquement tous dans la base de données à la fois?
OriginalL'auteur Clayton Gulick
Cette page sur le site officiel de mongodb adresses de site exactement cette question:
http://docs.mongodb.org/ecosystem/tutorial/model-data-for-ruby-on-rails/
c'est un changement de paradigme de la normalisation et de bases de données relationnelles. L'objectif d'un NoSQL est à lire et à écrire à partir de la base de données très rapidement. Avec BigData vous allez avoir une flopée de l'application et les serveurs front-end avec les numéros les plus bas sur la DBs. Vous êtes attendus à faire des millions de transactions par seconde. Déchargement de charges lourdes à partir de la base de données et de la mettre sur le niveau de l'application. Si vous avez besoin d'une analyse approfondie, vous exécutez une intégration de l'emploi qui met vos données dans une base de données OLAP. Vous ne devriez pas obtenir de nombreux profonde des requêtes à partir de votre OLTP dbs de toute façon.
Je dois aussi dire que ce n'est pas pour chaque projet de construction ou de conception. Si vous avez quelque chose qui fonctionne dans un type SQL base de données, pourquoi le changer? Si vous ne pouvez masser votre schéma de travailler avec le noSQL, alors ne le faites pas.
Migrations et de l'évolution constante des schémas sont aussi beaucoup plus facile à gérer sur un système NoSQL.
Que faire si l'utilisateur a 3,540 ont des postes dans le site web, et il le fait de changer son nom d'utilisateur dans le profil? À chaque post sera mis à jour avec le nouveau nom d'utilisateur?
OriginalL'auteur William Stein
Nous pouvons fusionner ou joindre toutes les données à l'intérieur d'une seule collection avec une simple fonction dans quelques lignes à l'aide de la mongodb client de la console, et maintenant, nous pourrions être en mesure d'effectuer la requête souhaitée.
Ci-dessous un exemple complet,
.- Auteurs:
.- Catégories:
.- Livres
.- Prêt de livres
.- La magie:
.- Obtenir la nouvelle collection de données:
.- Réponse 🙂
J'espère que ces lignes peuvent vous aider.
Ce qui se passe lorsque l'une des références des objets obtient une mise à jour? Ne fait que mettre à jour automatiquement refléter dans le livre objet? Ou boucle besoin de courir à nouveau?
C'est très bien aussi longtemps que vos données est petit. Il va apporter à chaque livre le contenu de votre client et de récupérer chaque catégorie, les prêts et les auteurs un par un. Le moment vos livres sont en milliers de dollars, ce serait aller vraiment, vraiment lent. Une meilleure technique serait sans doute d'utiliser l'agrégation de pipeline et de sortie les données fusionnées en une collecte séparée. Permettez-moi de revenir à nouveau. Je vais ajouter qu'une réponse.
Pouvez-vous adapter votre algorithme pour cet autre exemple? stackoverflow.com/q/32718079/287948
comment puis-je faire la somme de pipeline depuis que j'ai vraiment vraiment intensive de données dans des locaux séparés de collecte doivent s'inscrire ??
OriginalL'auteur Orlando Becerra
Vous devez le faire de la façon dont vous avez décrit. MongoDB est une base de données non relationnelle et ne prend pas en charge les jointures.
à partir d'un serveur sql à l'arrière-plan, je vous serais reconnaissant de MongoDB prendre un "ensemble de résultats' (avec une sélection de champs retournés) comme entrée pour une nouvelle requête en, un peu comme les requêtes imbriquées dans SQL
Vous avez vraiment un plan pour cela. Quels sont les champs que vous allez présenter sur l'extrémité avant, si c'est une quantité limitée dans une vue individuelle puis vous prenez ceux que les documents incorporés. La clé est de ne pas avoir besoin de faire des jointures. Si vous voulez faire une analyse profonde, vous le faites après le fait dans une autre base de données. L'exécution d'une tâche qui transforme les données dans un cube OLAP pour une performance optimale.
De mongo version 3.2 gauche jointures sont pris en charge.
OriginalL'auteur Otto Allmendinger
Voici un exemple d'un "rejoindre" * Acteurs et Films collections:
https://github.com/mongodb/cookbook/blob/master/content/patterns/pivot.txt
Il fait usage de
.mapReduce()
méthode* joignez-vous à - une alternative à la rejoindre dans les bases de données orientées document
Cette exactement ce que vous avez à faire, MongoDB n'est pas relationnelle, mais que le document orienté. MapReduce permet de jouer avec les données avec une grande performance (vous pouvez utiliser les armes etc....) mais même pour les cas simples, il est très utile !
Pourtant, la meilleure approche. Très utile merci
OriginalL'auteur antitoxic
Comme d'autres l'ont souligné, vous essayez de créer une base de données relationnelle à partir d'aucune base de données relationnelles qui vous n'avez pas vraiment envie de faire, mais de toute façon, si vous avez un cas que vous avez à faire ici est une solution que vous pouvez utiliser. Nous allons d'abord faire un foreach trouver sur Une collection( ou, dans votre cas, les utilisateurs) et nous nous faisons de chaque élément comme un objet, puis nous utilisons la propriété de l'objet (dans votre cas uid) pour la recherche dans notre deuxième collection (dans votre cas, commentaires) si nous pouvons le trouver, alors nous avons un match et nous pouvons imprimer ou faire quelque chose avec elle.
Espérons que cela vous aide, vous et bonne chance 🙂
L'habitude de cette découverte le point nous sommes actuellement en boucle sur?
C'est de la mauvaise performance sage pour de grandes collections.
OriginalL'auteur grepit
Cela dépend de ce que vous essayez de faire.
Actuellement, il est défini comme une base de données normalisée, ce qui est bien, et la façon dont vous le faites est approprié.
Cependant, il existe d'autres façons de le faire.
Vous pourriez avoir un des postes de la collection qui a noyé des commentaires pour chaque poste avec des références à des utilisateurs que vous pouvez de manière itérative requête pour obtenir. Vous pouvez stocker le nom de l'utilisateur avec les commentaires, vous pouvez les stocker dans un seul document.
La chose avec le NoSQL est qu'il est conçu pour des schémas flexibles et très rapide en lecture et en écriture. Dans un typique Big Data ferme la base de données est le plus gros goulot d'étranglement, vous avez moins de moteurs de base de données que vous n'application et les serveurs front-end...ils sont plus coûteux, mais plus puissant, aussi l'espace du disque dur est très bon marché relativement. La normalisation vient de la notion d'essayer d'économiser de l'espace, mais il est livré avec un coût à la prise de vos bases de données effectuer compliqué la Rejoint et la vérification de l'intégrité de relations, l'exécution d'opérations en cascade. Qui vous permet d'économiser les développeurs de certains maux de tête si ils ont conçu la base de données correctement.
Avec le NoSQL, si vous acceptez que la redondance et de l'espace de stockage ne sont pas des problèmes en raison de leur coût (à la fois dans le temps processeur requis pour effectuer des mises à jour pour le disque dur et les coûts de stocker des données supplémentaires), la dénormalisation n'est pas un problème (pour l'embarqué tableaux qui deviennent des centaines de milliers d'éléments qu'il peut être un problème de performances, mais la plupart du temps ce n'est pas un problème). En outre, vous aurez plusieurs applications et serveurs frontaux pour chaque cluster de base de données. Demandez-leur d'effectuer le levage lourd, des jointures et de laisser les serveurs de base de données de bâton de la lecture et de l'écriture.
TL;DR: Ce que vous faites est très bien, et il y a d'autres façons de le faire. Découvrez la mongodb documentation du modèle de données motifs de quelques grands exemples. http://docs.mongodb.org/manual/data-modeling/
la prévention de la redondance et de gagner de l'espace sont des notions similaires, mais sur la ré-analyse je suis d'accord, la redondance est la cause de cette conception. Je vais reformuler. Merci pour la note.
OriginalL'auteur Snowburnt
Vous pouvez joindre deux collection de Mongo en utilisant de recherche qui est offert en version 3.2. Dans votre cas, la requête serait
ou vous pouvez aussi vous joindre à l'égard des utilisateurs puis il y aura un peu de changement comme indiqué ci-dessous.
Il fonctionnera même que la gauche et la droite, rejoindre en SQL.
OriginalL'auteur jarry jafery
Il y a un cahier des charges que beaucoup de pilotes de soutien, appelé DBRef.
Prises de MongoDB Documentation: Modèles de Données > Modèle de Données de Référence >
Références De Base De Données
OriginalL'auteur Pickels
Avec la bonne combinaison de $recherche, $projet et $match, vous pouvez joindre plusieurs tables sur plusieurs paramètres. C'est parce qu'ils peuvent être enchaînés à plusieurs reprises.
Supposons que nous voulons faire à la suite (référence)
Étape 1: Lien de toutes les tables
vous pouvez $recherche autant de tables que vous voulez.
$recherche - une pour chaque table dans la requête
$détendez-vous - parce que les données sont denormalised correctement, d'autre enveloppé dans des tableaux
Code Python..
Étape 2: Définir l'ensemble des conditions
$projet : définir toutes les instructions conditionnelles ici, en plus de toutes les variables que vous souhaitez sélectionner.
Code Python..
Étape 3: Joindre toutes les conditions
$match - adhérer à toutes les conditions de l'aide OU ou ET etc. Il y a peut être des multiples de ces.
$projet: la destruction de toutes les conditions
Code Python..
Assez beaucoup n'importe quelle combinaison de tables, les conditions et les jointures peut être fait de cette manière.
OriginalL'auteur Shaurabh Bharti
$recherche (agrégation)
Effectue une jointure externe gauche pour un unsharded collection dans la même base de données de filtre dans les documents de la “joint” de la collection pour le traitement. Pour chaque document d'entrée, l' $recherche en scène ajoute un nouveau tableau de terrain dont les éléments sont les documents correspondants de la “joint” de la collection. L' $recherche étape passe ces remodelé documents à l'étape suivante.
L' $recherche de stage a les syntaxes suivantes:
L'Égalité Match
Pour effectuer une égalité de correspondance entre un champ de saisie de documents avec un champ à partir de documents de la “rejoint” la collecte, l' $recherche de stage a la syntaxe suivante:
L'opération correspond à la pseudo-instruction SQL:
Mongo URL
OriginalL'auteur GoutamS
Avant 3.2.6, Mongodb ne prend pas en charge requête de jointure comme mysql. ci-dessous la solution qui fonctionne pour vous.
OriginalL'auteur Anish Agarwal
Vous pouvez exécuter des requêtes SQL y compris joindre sur MongoDB avec mongo_fdw de Postgres.
OriginalL'auteur metdos
MongoDB ne permet pas de jointures, mais vous pouvez utiliser des plugins pour gérer cela. Vérifiez les mongo-rejoindre plugin. C'est le meilleur et je l'ai déjà utilisé. Vous pouvez l'installer à l'aide de mnp directement comme ceci
npm install mongo-join
. Vous pouvez consulter le une documentation complète avec des exemples.(++) vraiment utile quand on a besoin d'adhérer à (N) collections
( -- ), nous pouvons appliquer des conditions juste sur le haut niveau de la requête
Exemple
En effet, je upvoted due à une solution
OriginalL'auteur Amine_Dev
Vous pouvez le faire en utilisant l'agrégation de pipeline, mais c'est une douleur à l'écrire vous-même.
Vous pouvez utiliser
mongo-rejoignez-requête
pour créer l'agrégation pipeline automatiquement à partir de votre requête.C'est comment votre requête devrait ressembler à:
Votre résultat aurait l'utilisateur de l'objet dans le
uid
champ et vous pouvez faire un lien sur autant de niveaux que vous le souhaitez. Vous pouvez remplir la référence à l'utilisateur, qui fait référence à une Équipe, ce qui fait référence à quelque chose d'autre, etc..Avertissement: j'ai écrit
mongo-join-query
pour s'attaquer à ce problème exact.OriginalL'auteur Marcelo Lazaroni
playORM peut le faire pour vous à l'aide de S-SQL(Scalable SQL) ce qui ajoute de partitionnement tel que vous pouvez le faire se joint à l'intérieur de partitions.
OriginalL'auteur Dean Hiller
Non, il ne semble pas comme vous le faites mal. MongoDB jointures "côté client". Un peu comme vous l'avez dit:
Ce n'est pas un "vrai" joindre, mais il est en fait beaucoup plus utile qu'une jointure SQL parce que vous n'avez pas à traiter avec des doublons de lignes de "nombreux" face jointures, à la place de votre décoration à l'origine de la série choisie.
Il y a beaucoup de non-sens et le FUD sur cette page. S'avère que 5 ans plus tard, MongoDB est toujours une chose.
Downvote, vraiment?
assurez-vous. Dans SQL a n-n relation sera de retour les lignes en double. E. g. Des amis. Si Bob est amis avec Marie et Jeanne, vous bénéficierez de 2 lignes pour Bob: Bob,Mary et Bob,Jane. 2 Bobs est un mensonge, il y a seulement un Bob. Côté client joint, vous pouvez commencer avec Bob et décorer la façon dont vous le souhaitez: Bob, "Mary Jane". SQL vous permet de faire cela avec des sous-requêtes, mais c'est en faisant le travail sur le serveur de base de données qui pourrait être fait sur le client.
OriginalL'auteur Michael Cole
Je pense que, si Vous avez besoin d'normalisé tableaux de données - Vous avez besoin d'essayer d'autres solutions de base de données.
Mais j'ai foun que la solution pour MOngo sur Git
Par ailleurs, en insère un code - a film du nom, mais de l'avis d'intention du film ID.
Problème
Vous avez un ensemble d'Acteurs avec un tableau de Films qu'ils ont fait.
Vous souhaitez générer une collection de Films avec un éventail d'Acteurs dans chaque.
Quelques exemples de données
Solution
Nous avons besoin d'une boucle sur chaque film dans l'Acteur document et émettent chaque Film individuellement.
Le piège ici est de réduire la phase. Nous ne pouvons pas émettre un tableau à partir de la réduire en phase, de sorte que nous devons construire un Acteurs de la matrice à l'intérieur de la "valeur" d'un document qui est retourné.
Le code
Avis comment actor_list est en fait un objet javascript qui contient un tableau. Notez également que la carte émet la même structure.
Exécutez la procédure suivante pour exécuter le map /reduce, sortie pour le "pivot" de collecte et d'imprimer le résultat:
printjson(db.les acteurs.mapReduce(carte, de réduire, de "pivot"));
db.pivot.find().forEach(printjson);
Voici un exemple de sortie, note que "Pretty Woman" et "Runaway Bride" ont les deux "Richard Gere" et "Julia Roberts".
OriginalL'auteur Max Sherbakov
Nous pouvons fusionner les deux de la collection en utilisant mongoDB sous-requête. Ici est un exemple,
Commentss--
Userss--
MongoDB sous-requête pour JOINDRE--
Obtenez le résultat de nouvellement générés Collection--
Résultat--
Espère que ce sera de l'aide.
OriginalL'auteur Krishna