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()