Index des tableaux et des sous-documents
Index des tableaux (multi-clés)
Objectif des index multi-clés
- Accélèrent les requêtes sur les éléments de tableaux
- Créés automatiquement pour les champs de tableaux lors de l'indexation
Commande pour créer un index multi-clés
- Utiliser la commande :
db.collection.createIndex({field: 1})
- Exemple :
db.products.createIndex({tags: 1})
Recherche dans les tableaux avec des index multi-clés
- Opérateurs spécifiques :
$all
, $elemMatch
, $size
- Exemples:
$all
: db.products.find({tags: {$all: ["electronics", "computers"]}})
$elemMatch
: db.students.find({grades: {$elemMatch: {score: {$gt: 90}}}})
$size
: db.products.find({tags: {$size: 3}})
Limitations des index multi-clés
- Ne peuvent pas couvrir plusieurs champs de tableaux dans une seule requête
- Les index multi-clés à composés sont limités à 31 champs maximum
Index des sous-documents
Objectif
- Améliorer les requêtes sur les sous-documents avec des index
- Indexer les sous-champs pour optimiser les recherches
Création d'index sur un sous-champ
- Commande :
db.collection.createIndex({"field.subfield": 1})
- Exemple :
db.users.createIndex({"address.city": 1})
Recherche dans les sous-documents
- Notation pointée pour accéder aux sous-champs
- Exemple
// Recherche d'utilisateurs par ville :
db.users.find({"address.city": "New York"})
// Recherche d'utilisateurs par code postal et pays :
db.users.createIndex({"address.zip": 1, "address.country": 1})
db.users.find({"address.zip": "12345", "address.country": "USA"})
Tri des résultats
- Utiliser
.sort()
avec la notation pointée
- Exemple :
db.users.find().sort({"address.city": 1})
Recherche et requêtes avancées
Index multi-clés et sous-documents
- Index multi-clés pour les requêtes sur les tableaux
- Notation pointée pour les requêtes sur les sous-documents
Exemples de requêtes avancées
- Combinaison de conditions sur un tableau et un sous-document :
db.users.find({tags: "developer", "address.city": "Paris"})
- Utilisation de $elemMatch pour filtrer sur plusieurs conditions dans un tableau :
db.users.find({hobbies: {$elemMatch: {name: "tennis", skillLevel: {$gte: 3}}}})