Premières requêtes MongoDB

Planche de TD pour un cours dispensé à l’université de Rennes 2

Romain Tavenard

1 Avant-propos

Lors de ce TD, vous allez utiliser l’interface Studio 3T (ou Robo 3T) pour vous connecter à des bases de données MongoDB. Dans le cadre de ce TD, le serveur MongoDB sera soit lancé dans une machine virtuelle sur votre poste, soit une instance MongoDB Atlas (cf. Guide d’installation).

  1. Connectez vous à un serveur comme indiqué dans le guide d’installation et observez les noms des bases de données disponibles (panneau de gauche de votre fenêtre)

  2. Vous devriez voir une base nommée test. Cliquez droit sur le nom de cette base et choisissez “Open (Intelli)Shell”. Une invite de commande s’ouvre alors dans le panneau de droite : c’est là que vous entrerez vos requêtes (et vous cliquerez sur la flèche verte pour exécuter votre commande).

Pour connaître la liste des collections contenues dans une base de données, on utilise la commande :

db.getCollectionInfos()

Enfin, pour connaître le nombre de documents dans une collection, la syntaxe à utiliser est :

db.nomDeLaCollection.count()
  1. Combien de collections contient la base test ? Et combien de documents contiennent chacune de ces collections ?

2 Premières requêtes

Il existe en MongoDB deux types de requêtes simples, retournant respectivement toutes les occurrences d’une collection ou la première :

db.nomDeLaCollection.find()
db.nomDeLaCollection.findOne()
  1. Chargez la base de données test et affichez le contenu de chacune de ses collections.

Nous allons maintenant changer de base de données de travail. Pour cela, basculez sur une base appelée food (clic droit sur le nom de la base, puis “Open Shell”).

Si l’on souhaite fixer des contraintes sur les documents à retourner, il suffit de passer en argument d’une de ces fonctions un document masque contenant les valeurs souhaitées. Par exemple, la requête suivante retourne tous les documents ayant un champ "x" dont la valeur est "y" :

db.nomDeLaCollection.find({"x": "y"})
  1. Utilisez cette syntaxe pour n’afficher que les documents de la collection NYfood correspondant à des boulangeries (pour lesquels le champ "cuisine" vaut "Bakery"). Comptez le nombre de résultats (la méthode count() accepte un document masque elle aussi).

  2. Affichez maintenant la liste des boulangeries du Bronx. Combien y a-t-il de restaurants chinois ("Chinese") à Brooklyn ?

Les résultats que vous avez obtenus jusqu’à présent sont assez indigestes, notamment parce que toutes les clés sont retournées pour tous les documents. Il est possible de limiter cela en spécifiant les clés à retourner comme second argument de find(), ici la clé "z":

db.nomDeLaCollection.find({"x": "y"}, {"z": true})
  1. Utilisez cette astuce pour n’afficher que les noms des boulangeries du Bronx.

  2. Affichez les nom et notes (mais pas les dates de naissance) des étudiants prénommés Marc dans la base etudiants.

3 Opérateurs de comparaison

Pour effectuer des requêtes plus complexes, impliquant des opérateurs de comparaison, on utilisera la syntaxe suivante :

db.nomDeLaCollection.find({"x": {operateur: valeur}})

Il est à noter que le sous-document contenant l’opérateur peut en fait contenir plusieurs opérateurs et ainsi ne seront retournés que les documents vérifiant toutes les conditions.

Les opérateurs les plus classiques sont les suivants :

Opérateur logique Mot-clé MongoDB
< $lt
> $gt
<= $lte
>= $gte
“est dans la liste” $in
“n’est pas dans la liste” $nin

Enfin, le mot-clé $exists permet de ne retourner que les documents dans lesquels la clé spécifiée existe.

  1. Affichez la liste des étudiants ayant au moins une note au-dessus de 10.

  2. Que retourne la requête suivante ? Vérifiez votre intuition.

db.notes.find({"notes": {$gt: 12, $lte: 10}})
  1. Affichez le nom de tous les restaurants chinois du Bronx et de Brooklyn dans une même liste. Vous pourrez utiliser la méthode count() pour vérifier que la liste obtenue est bien la fusion des deux listes issues de chaque quartier.

  2. Affichez le nom de toutes les boulangeries du Bronx commençant par la lettre "P".

Lorsque l’on souhaite effectuer un test sur une date, on utilisera toujours des opérateurs de comparaison. Toutefois, pour comparer les dates d’une base à des dates de référence, il faudra :

d1 = new Date("AAAA-MM-JJ")
  1. Dans la base de données etudiants, affichez tous les étudiants nés après le 1er Janvier 1995.

  2. Même question en ne sélectionnant que les étudiantes.

  3. Dans la base de données test, affichez la liste des posts en date du 26 Août 2015.

Enfin, il est possible de combiner plusieurs conditions à l’aide de l’opérateur $or :

db.nomDeLaCollection.find({$or: [{"x": 1}, {"y": "zzz"}]})

La commande précédente retournera ainsi l’ensemble des documents vérifiant au moins une des deux conditions suivantes :

De la même façon, l’opérateur $nor permet de ne retourner que les documents ne vérifiant aucune des conditions spécifiées.

  1. Affichez la liste des étudiants qui vérifient l’une des deux conditions suivantes :

Lorsque l’on travaille sur des listes, il peut être utile de tester leur longueur, ce qui se fait avec le mot-clé $size :

db.nomDeLaCollection.find({"cleDeLaListe": {$size: 12}})

ne retournera ainsi que les documents pour lesquels la valeur associée à la clé cleDeLaListe est une liste de taille 12.

  1. En utilisant la base test, affichez la liste des posts n’ayant pas reçu de commentaire.

  2. En utilisant la base etudiants, affichez la liste des étudiants ayant obtenu exactement deux notes.

  3. Affichez la liste des étudiants ayant obtenu une ou deux notes.

  4. Affichez la liste des étudiants ayant obtenu au moins deux notes.