Aller au contenu

Recherche d’informations#

Requêtes de documents#

Pour faire des recherches, on utilise la fonction find() et findOne()

  • Sans paramètre, elle renvoie l’ensemble des documents.
    • Il faut donc l’utiliser avec précautions.
  • Elle peut aussi prendre deux paramètres :
    • les critères de sélection des documents
    • les choix d’items des documents à afficher

Ces deux paramètres doivent être écrits sous la forme d’objets JSON.

> db.coll.find(..)

Exemple : recherche d'après deux critères

> db.coll.find({"cuisine": "Bakery", "borough": "Bronx"})

Note

Pour rendre le resultat plus plaisant à l'oeil on peut ajouter la fonction pretty() sur le résultat du find()

> db.coll.find(..).pretty()

Recherche sur une clé de sous-document#

> db.coll.find({"address.zipcode": "10462"})

Projection#

Pour afficher seulement certains éléments, on peut ajouter un deuxième argument spécifiant les items que l’on veut (valeur 1) ou qu’on ne veut pas (avec valeur 0).

> db.restaurants.find({ cuisine: "French" }, { name: 1 })

Par défaut, l’identifiant du document, toujours nommé _id, est renvoyé. Pour ne pas l’avoir, il faut ainsi le préciser avec "_id": 0.

> db.restaurants.find({ cuisine: "French" }, { _id: 0, name: 1 })

Sous-item#

Les documents peuvent être complexes (c’est même le but), et les critères portent donc souvent sur des sous-items. Il faut utiliser le même formalisme déjà vu ("item.sousitem"). Il faut noter deux choses :

  • on peut aller aussi loin que nécessaire dans l’utilisation du . ;
  • il est obligatoire d’utiliser des ‘””’ pour les items.

    db.restaurants.find({ "grades.grade" : "A" }, { _id: 0, name: 1 })

Ce formalisme est le même pour indiquer un sous-item à afficher. Nous ajoutons à la requête précédent l’affichage des scores. Nous voyons que le résultat inclu tous les scores.

> db.restaurants.find({ "grades.grade" : "A" }, { _id: 0, name: 1, "grades.grade" : 1 })

Comparaisons avec d'autres opérateurs#

Opération Syntaxe
Egalité {<key>: <value>}
Inférieur à {<key>: {$lt: <value>}}
Inférieur ou égal à {<key>: {$lte: <value>}}
Supérieur à {<key>: {$gt: <value>}}
Supérieur ou égal à {<key>: {$gte: <value>}}
Différent de {<key>: {$ne: <value>}}

Exemples:

> db.coll.find({"by": "point"}).pretty()

// where age >= 18
> db.coll.find({"age": {$gte: 18}}).pretty() 

Opérateurs logiques#

ET logique#

Il suffit de passer plusieurs clés séparées par ","

> db.coll.find({ 
    key1:value1, 
    key2:value2
  }).pretty()

OU logique#

>db.coll.find({
    $or: [
      {key1: value1}, {key2:value2}
    ]
  }).pretty()

Ex:

>db.coll.find({
    $or: [
      {"by":"tutorials"},
      {"title": "MongoDB Overview"}
    ]
  }).pretty()

NON OU logique#

> db.coll.find({
    $nor: [
      {"by": "tutorials"}, 
      {"title": "MongoDB Overview"}
    ]
  }).pretty()

NON logique#

> db.coll.find({
    $not: {"by": "tutorials"}
  }).pretty()

ET + OU logique#

> db.coll.find({
    "likes": {$gt:10}, 
    $or: [
      {"by": "tutorials"}, 
      {"title": "MongoDB Overview"}
    ]
  }).pretty()

Equivalent SQL:

SELECT * FROM ... 
WHERE likes > 10
  AND (by = "tutorials" OR "title" = "MongoDB Overview")

Présence d’un item#

Pour tester la présence ou non d’un item, on utilise l’opérateur $exists avec

  • true si on teste la présence
  • et false l’absence
> db.restaurants.find({ french : { $exists: true } }, { _id: 0, name: 1 })

Dénombrement#

La fonction count() peut s'ajouter à la suite d’une fonction find() pour connaître la taille du résultat.

> db.restaurants.find({ cuisine : "French" }).count()