162 votes

MongoDB et les "jointures

Je suis sûr que MongoDB ne prend pas officiellement en charge les "jointures". Qu'est-ce que cela signifie ?

Cela signifie-t-il "Nous ne pouvons pas connecter deux collections (tables) ensemble" ?

Je pense que si on met la valeur de _id dans la collection A à la other_id dans la collection B, peut-on simplement connecter deux collections ?

Si je comprends bien, MongoDB peut connecter deux tables ensemble, par exemple, lorsque nous exécutons une requête. Ceci est fait par la "Référence" écrite dans http://www.mongodb.org/display/DOCS/Schema+Design .

Alors, que signifie vraiment le terme "jointures" ?

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

99voto

Emil Vikström Points 42251

Il n'y a pas de jointure puisque la relation ne sera évaluée qu'en cas de besoin. En revanche, une jointure (dans une base de données SQL) résout les relations et les renvoie 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. Il suffit d'enregistrer l'_id d'un document dans l'other_id d'un autre document, puis d'écrire votre propre fonction pour résoudre la relation. L'autre solution consiste à utiliser DBRefs 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 n'a pas beaucoup d'importance car les deux méthodes résoudront la relation côté client (notez qu'une base de données SQL résout les jointures côté serveur).

31voto

dm. Points 1284

La base de données 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 en faire 2, c'est bien, mais si vous deviez en faire 2000, le nombre de rotations client/serveur rendrait l'opération lente.

Dans MongoDB, un modèle courant est l'incorporation. Dans le relationnel, lors de la normalisation, les choses sont divisées en plusieurs parties. Souvent, dans Mongo, ces parties finissent par constituer un document unique, de sorte qu'aucune jointure n'est nécessaire de toute façon. Mais lorsqu'une jointure est nécessaire, on la fait côté client.

Prenons l'exemple classique de ORDER, ORDER-LINEITEM. Une commande et 8 lignes d'articles représentent 9 lignes en relationnel ; dans MongoDB, nous modélisons généralement cela comme un document BSON unique qui est une commande avec un tableau de lignes d'articles incorporées. Dans ce cas, la question de la jointure ne se pose donc pas. Cependant, la commande a un CLIENT qui est probablement une collection séparée - le client peut lire le cust_id dans le document de la commande, puis aller le chercher séparément si nécessaire.

Il existe des vidéos et des diapositives pour les discussions sur la conception de schémas sur le site mongodb.org, je crois.

12voto

Sérgio Points 854

Une sorte de requête jointe dans mongoDB, consiste à demander à une collection les identifiants qui correspondent, à les mettre dans une liste (idlist), et à effectuer une recherche en utilisant l'autre (ou la même) collection avec $in : idlist.

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

6voto

Ian Mercer Points 19271

Le premier exemple que vous avez cité montre que les références 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 sur l'une d'entre elles, puis la consultation d'éléments d'une autre collection par référence.

1voto

pfrank Points 700

Envisagez-vous d'utiliser la mangouste ? Il vous donne la possibilité d'effectuer des jointures sur des données mongo.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X