web-dev-qa-db-fra.com

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 plaçons la valeur de _id dans la collection A dans le other_id dans la collection B, pouvons-nous simplement connecter deux collections?

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

Alors qu'est-ce que "joint" signifie vraiment?

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

162
TK.

Ce n'est pas une jointure puisque la relation ne sera évaluée qu'en cas de besoin. Une jointure (dans une base de données SQL), par contre, résoudra les relations et les retournera comme s’il s’agissait d’une seule table (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. La première consiste à le faire manuellement, comme vous l'avez presque décrit. Sauvegardez simplement le _id d'un document dans le other_id d'un autre document, 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 peu, car les deux méthodes vont résoudre la relation côté client (notez qu'une base de données SQL résout les jointures côté serveur).

98
Emil Vikström

Depuis 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 docs:

{
   $lookup:
     {
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents of the "from" collection>,
       as: <output array field>
     }
}
50
Clayton Gulick

La base de données ne fait pas de jointures - ni de "liaison" automatique entre les documents. Cependant, vous pouvez le faire vous-même côté client. Si vous devez en faire 2, c'est bon, mais si vous deviez en faire 2000, le nombre de redressements client/serveur ralentirait l'opération.

Dans MongoDB, un modèle commun est en train d’être incorporé. En relationnel lors de la normalisation, les choses se brisent en plusieurs parties. Souvent, au mongo, ces éléments 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. Un ordre et 8 éléments de ligne correspondent à 9 lignes en relation; Dans MongoDB, nous modélisons généralement ceci sous la forme d'un document BSON unique, qui correspond à un ordre avec un tableau d'éléments de ligne incorporés. Donc, dans ce cas, le problème de la jointure ne se pose pas. Cependant, la commande aurait un CLIENT qui serait probablement une collection séparée - le client pourrait lire le cust_id du document de commande, puis aller le chercher séparément si nécessaire.

Il y a quelques vidéos et diapositives pour des présentations sur la conception de schéma sur le site Web mongodb.org I Belive.

31
dm.

un type de jointure à une requête dans mongoDB, est de demander à une collection l’id qui correspond, de mettre les identifiants dans une liste (idlist) et de les utiliser avec une autre (ou la même) collection avec $ in: idlist

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

Le premier exemple que vous créez un lien montre comment les références MongoDB se comportent beaucoup comme un chargement différé et non comme une jointure. Il n'y a pas de requête sur les deux collections, mais vous en interrogez une, puis vous recherchez des éléments d'une autre collection par référence.

6
Ian Mercer

Le fait que mongoDB ne soit pas relationnel a conduit certaines personnes le considèrent comme inutile . Je pense que vous devriez savoir ce que vous faites avant de concevoir une base de données. Si vous choisissez d'utiliser noSQL DB tel que MongoDB, il est préférable d'implémenter un schéma. Vos collections - plus ou moins - ressembleront à des tables de bases de données SQL. Évitez également la dénormalisation (incorporation), sauf si cela est nécessaire pour des raisons d'efficacité.

Si vous souhaitez concevoir votre propre base de données noSQL, je vous suggère de consulter Firebase documentation. 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 ceci package (Je ne connais pas d'autre cadre qui vous permette de le faire). Cependant, je vous suggère de lire ceci article avant de décider de choisir ce choix.

Edit 28.04.17: Récemment, Firebase a publié ce excellente série sur la conception de bases de données noSql. Ils ont également mis en évidence dans l'un des épisodes les raisons d'éviter les jointures et comment contourner de tels scénarios en dénormalisant votre base de données.

5
Salah Saleh

Pensez à utiliser la mangouste? Il vous donne la possibilité de faire des jointures sur des données Mongo.

1
pfrank

Si vous utilisez Mangouste, vous pouvez simplement utiliser (en supposant que vous utilisez des sous-documents et de 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 Statuses qui appartient à l'un de vos amis Profile (profileId). Friends est un tableau de références à d'autres Profiles. Profile schéma avec friends défini:

schema = new mongoose.Schema
  # ...

  friends: [
    type: mongoose.Schema.Types.ObjectId
    ref: 'Profile'
    unique: true
    index: true
  ]
1
Daniel Kmak

vous pouvez utiliser les addons MongoDB, c'est génial, et autoriser à rejoindre, fusionner et créer un générateur de requête l'essayer: https://github.com/petersirka/mongodb-addons

1
Amine_Dev

Je suis tombé sur de nombreux articles à la recherche du même article - "Jointures Mongodb" et alternatives ou équivalents. Donc, ma réponse aiderait beaucoup d'autres qui sont comme moi. C'est la réponse que je chercherais.

J'utilise Mongoose avec le framework Express. Il existe une fonctionnalité appelée Population à la place des jointures.

Comme mentionné dans Mongoose docs .

Il n’existe aucune jointure dans MongoDB mais nous souhaitons parfois quand même faire référence à des documents d’autres collections. C'est là qu'intervient la population.

Ce réponse StackOverflow montre un exemple simple d'utilisation.

0
mythicalcoder

Étant moi-même utilisateur de MongoDB, je devais extraire assez souvent des données de collections connexes. Lorsque des personnes stockent des données de bases de données relationnelles dans des bases de données NoSQL, la "jonction" devient nécessaire. Voici une bibliothèque que j'ai réalisée avec mon ami pour exécuter des jointures Mongo dans Python -

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

Le code n'est pas trop compliqué et vaut la peine d'être essayé!

0
Utsav T