mongodb php - comment faire “INNER JOIN”-comme requête
Je suis en utilisant le Mongo extension PHP.
Mon apparence des données:
users
{
"_id": "4ca30369fd0e910ecc000006",
"login": "user11",
"pass": "example_pass",
"date": "2010-09-29"
},
{
"_id": "4ca30373fd0e910ecc000007",
"login": "user22",
"pass": "example_pass",
"date": "2010-09-29"
}
news
{
"_id": "4ca305c2fd0e910ecc000003",
"name": "news 333",
"content": "news content 3333",
"user_id": "4ca30373fd0e910ecc000007",
"date": "2010-09-29"
},
{
"_id": "4ca305c2fd0e910ecc00000b",
"name": "news 222",
"content": "news content 2222",
"user_id": "4ca30373fd0e910ecc000007",
"date": "2010-09-29"
},
{
"_id": "4ca305b5fd0e910ecc00000a",
"name": "news 111",
"content": "news content",
"user_id": "4ca30369fd0e910ecc000006",
"date": "2010-09-29"
}
Comment exécuter une requête similaire, comme cela, à partir de PHP?
SELECT n.*, u.*
FROM news AS n
INNER JOIN users AS u ON n.user_id = u.id
OriginalL'auteur persten | 2010-09-30
Vous devez vous connecter pour publier un commentaire.
MongoDB ne prend pas en charge les jointures. Si vous souhaitez mapper les utilisateurs de l'actualité, vous pouvez effectuer les opérations suivantes
1) Faire à la couche application. Obtenir la liste des utilisateurs, et d'obtenir la liste des news et de la carte dans votre application. Cette méthode est très coûteuse si vous avez besoin de ce souvent.
2) Si vous avez besoin de faire de la précédente étape, souvent, vous devriez revoir votre schéma de sorte que les articles de presse sont stockées intégré des documents avec les documents de l'utilisateur.
Une fois que vous avez vos données dans ce format, la requête que vous essayez d'exécuter est implicite. Une chose à noter, cependant, est que l'analyse des requêtes de devenir difficile sur un tel schéma. Vous aurez besoin d'utiliser MapReduce pour obtenir le plus récemment ajouté des articles de presse et de telles requêtes.
À la fin, le schéma de la conception et de la façon dont beaucoup de dénormalisation de votre application peut gérer dépend de quel type de requêtes que vous attendez de votre application à exécuter.
Vous pouvez trouver ces liens utiles.
http://www.mongodb.org/display/DOCS/Schema+Design
http://www.blip.tv/file/3704083
J'espère que c'était utile.
Vous pouvez utiliser dbrefs au lieu de la véritable document docs.mongodb.org/manual/applications/database-references
Cette réponse est la plus correcte et doit être mis à jour pour refléter ce fait.
OriginalL'auteur srivani
Oublier sur les jointures.
faites une recherche sur votre actualité. Appliquer le skip nombre et la limite pour la pagination des résultats.
ensuite une boucle à travers la collecte et de saisir le user_id dans cet exemple, vous devriez être limitée à 10 points. Maintenant, faites une requête sur les utilisateurs pour le trouvé user_id éléments.
Puis, quand vous imprimez le ou les nouvelles, il peut afficher des informations de l'utilisateur à partir de la collection pour l'utilisateur basée sur le user_id.
Vous fait 2 requêtes à la base de données. Pas de déconner avec des jointures et de trouver des noms de champ, etc. SIMPLE!!!
OriginalL'auteur Richard Torcato
Vous pourriez être mieux de l'intégration de la "nouvelle" au sein des utilisateurs de documents.
OriginalL'auteur luckytaxi
Si vous utilisez la nouvelle version de MongoDB (3.2), alors, vous obtiendrez quelque chose de similaire avec les
$recherche
de l'opérateur.Les inconvénients à l'utilisation de cet opérateur est qu'il est très inefficace lorsqu'il est utilisé sur de grands ensembles de résultats et il prend en charge de l'égalité pour le match, où l'égalité est une clé unique de chaque collection. L'autre limitation est que le bouton droit de la collection doit être un unsharded collection dans la même base de données que la gauche-collection.
Suivantes opération d'agrégation sur la
news
collection rejoint les documents denews
avec les documents de lausers
collection en utilisant les champsuser_id
de lanews
de la collecte et de la_id
champ de lausers
collection:L'équivalent en PHP par exemple la mise en œuvre:
INNER
rejoint.OriginalL'auteur chridam
Vous ne pouvez pas le faire dans mongoDB. Et à partir de la version 3 Eval() est obsolète, de sorte que vous ne devriez pas utiliser des procédures stockées.
Le seul moyen que je connaisse pour réaliser un serveur de requête côté impliquant de multiples collections de maintenant, c'est d'utiliser Node.js ou similaire. Mais si vous optez pour cette méthode, je vous recommande fortement de limiter les adresses ip autorisées à accéder à votre machine, pour des raisons de sécurité.
Aussi, si vos collections ne sont pas trop gros, vous pouvez éviter les jointures internes dénormalisation.
OriginalL'auteur Adrian Lopez