MongoDB et «rejoint»

Je suis sûr que MongoDB ne supporte pas officiellement les “jointures”. Qu’est-ce que ça veut dire?

Est-ce que cela signifie “Nous ne pouvons pas connecter deux collections (tables) ensemble”?

Je pense que si nous mettons la valeur de _id dans la collection A à l’ other_id de la collection B, pouvons-nous simplement connecter deux collections?

Si ma compréhension est correcte, MongoDB peut connecter deux tables, par exemple, lorsque nous exécutons une requête. Ceci est fait par “Reference” écrit dans http://www.mongodb.org/display/DOCS/Schema+Design .

Alors, qu’est-ce que “join” signifie vraiment?

J’aimerais connaître la réponse car c’est essentiel pour apprendre la conception de schéma MongoDB. http://www.mongodb.org/display/DOCS/Schema+Design

Ce n’est pas une jointure puisque la relation ne sera évaluée qu’en cas de besoin. En revanche, une jointure (dans une firebase database SQL) résoudra les relations et les renverra comme s’il s’agissait d’une table unique (vous «joignez deux tables en une»).

Vous pouvez en savoir plus sur DBRef ici: http://docs.mongodb.org/manual/applications/database-references/

Il existe deux solutions possibles pour résoudre les références. L’une consiste à le faire manuellement, comme vous l’avez presque décrit. Enregistrez simplement le _id d’un document dans un autre identifiant, puis écrivez votre propre fonction pour résoudre la relation. L’autre solution consiste à utiliser DBRef comme décrit dans la page de manuel ci-dessus, ce qui permettra à MongoDB de résoudre la relation côté client à la demande. La solution que vous choisissez importe moins car les deux méthodes résoudront la relation côté client (notez qu’une firebase database SQL résout les jointures côté serveur).

A partir de Mongo 3.2, la réponse à cette question n’est plus correcte. Le nouvel opérateur $ lookup ajouté au pipeline d’agrégation est essentiellement identique à une jointure externe gauche:

https://docs.mongodb.org/master/reference/operator/aggregation/lookup/#pipe._S_lookup

De la documentation:

 { $lookup: { from: , localField: , foreignField: , as:  } } 

La firebase database ne fait pas de jointures – ou de “liens” automatiques entre les documents. Cependant, vous pouvez le faire vous-même côté client. Si vous devez faire 2, c’est bien, mais si vous deviez le faire 2000, le nombre de tours client / serveur rendrait l’opération lente.

Dans MongoDB, un modèle commun est l’intégration. En relationnel, lorsque les choses se normalisent, elles se divisent en plusieurs parties. Souvent, dans mongo ces pièces finissent par être un document unique, de sorte qu’aucune jointure n’est nécessaire de toute façon. Mais quand on en a besoin, on le fait côté client.

Prenons l’exemple classique ORDER, ORDER-LINEITEM. Une commande et 8 éléments de ligne sont 9 lignes en relationnel; dans MongoDB, nous modéliserions simplement ceci comme un seul document BSON, qui est un ordre avec un tableau d’éléments de ligne intégrés. Donc, dans ce cas, la question de la jointure ne se pose pas. Cependant, la commande aurait un CLIENT qui est probablement une collection distincte – le client pourrait lire le cust_id à partir du document de commande, puis le récupérer séparément si nécessaire.

Il y a des vidéos et des diapositives pour les discussions sur la conception des schémas sur le site Web mongodb.org que je crois.

un type de joindre une requête dans mongoDB, est de demander à une collection pour id qui correspond, de mettre des identifiants dans une liste (idlist), et de trouver l’utilisation sur une autre collection (ou la même) avec $ dans: idlist

 u = db.friends.find({"friends": something }).toArray() idlist= [] u.forEach(function(myDoc) { idlist.push(myDoc.id ); } ) db.family.find({"id": {$in : idlist} } ) 

Le premier exemple auquel vous accédez montre comment les références de MongoDB se comportent comme un chargement paresseux et non comme une jointure. Il n’y a pas de requête sur les deux collections, mais plutôt une requête, puis vous recherchez des éléments d’une autre collection par référence.

Le fait que mongoDB ne soit pas relationnel a amené certaines personnes à le considérer comme inutile . Je pense que vous devriez savoir ce que vous faites avant de concevoir une firebase database. Si vous choisissez d’utiliser la firebase database noSQL, telle que MongoDB, vous devez mieux implémenter un schéma. Cela permettra à vos collections – plus ou moins – de ressembler à des tables dans des bases de données SQL. Evitez également la dénormalisation (incorporation), sauf si cela est nécessaire pour des raisons d’efficacité.

Si vous souhaitez concevoir votre propre firebase database noSQL, je suggère de consulter la documentation de Firebase . Si vous comprenez comment ils organisent les données pour leur service, vous pouvez facilement concevoir un modèle similaire pour le vôtre.

Comme d’autres l’ont fait remarquer, vous devrez faire les jointures côté client, sauf avec Meteor (un framework Javascript), vous pouvez faire vos jointures côté serveur avec ce paquet (je ne connais pas d’autre framework qui vous permette de faire alors). Cependant, je vous suggère de lire cet article avant de choisir ce choix.

Edit 28.04.17: Récemment, Firebase a publié cette excellente série sur la conception de bases de données noSql. Ils ont également souligné dans l’ un des épisodes les raisons d’éviter les jointures et comment contourner ces scénarios en dénormalisant votre firebase database.

Envisagez d’utiliser de la mongoose? Cela vous donne la possibilité de faire des jointures sur des données mongo.

Si vous utilisez de la mongoose, vous pouvez simplement utiliser (en supposant que vous utilisez des sous-documents et la population):

 Profile.findById profileId .select 'friends' .exec (err, profile) -> if err or not profile handleError err, profile, res else Status.find { profile: { $in: profile.friends } }, (err, statuses) -> if err handleErr err, statuses, res else res.json createJSON statuses 

Il récupère les Statuses appartenant à l’un des amis de Profile ( profileId ). Friends est un tableau de références à d’autres Profiles . Schéma de Profile avec des friends définis:

 schema = new mongoose.Schema # ... friends: [ type: mongoose.Schema.Types.ObjectId ref: 'Profile' unique: true index: true ] 

vous pouvez utiliser les addons MongoDB, c’est génial, et permettre de rejoindre, fusionner et créer un générateur de requêtes essayez-le: https://github.com/petersirka/mongodb-addons

Étant moi-même utilisateur de MongoDB, j’ai dû récupérer des données de collections associées assez fréquemment. Lorsque des personnes stockent des données de bases de données relationnelles dans des bases de données NoSQL, “joindre” devient nécessaire. Voici une bibliothèque que j’ai créée avec mon ami pour interpréter Mongo Joins en Python –

https://pypi.python.org/pypi/mongojoin/1.0.0

Le code n’est pas trop compliqué et vaut la peine d’essayer!

Je suis tombé sur beaucoup de messages cherchant le même – “Mongodb Joins” et alternatives ou équivalents. Donc, ma réponse aiderait beaucoup d’autres qui sont comme moi. C’est la réponse que je rechercherais.

J’utilise Mongoose avec Express Framework. Il existe une fonctionnalité appelée Population à la place des jointures.

Comme mentionné dans les documents Mongoose.

Il n’y a pas de jointures dans MongoDB mais parfois nous voulons toujours des références à des documents dans d’autres collections. C’est là que la population entre en jeu.

Cette réponse StackOverflow montre un exemple simple d’utilisation.