FAQ MongoDBConsultez toutes les FAQ

Nombre d'auteurs : 1, nombre de questions : 331, dernière mise à jour : 18 décembre 2016  Ajouter une question

 

Cette FAQ a été réalisée à partir de la documentation officielle de Mongodb, des questions fréquemment posées sur les forums NoSQL Developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.


SommaireIndex (13)
précédent sommaire suivant
 

Cette partie traite de questions courantes concernant les index MongoDB.

Si vous ne trouvez pas la réponse que vous recherchez, consultez la liste complète des FAQ ou postez votre question dans la liste de diffusion des utilisateurs MongoDB.

Mis à jour le 11 décembre 2016

Non. Vous devez uniquement créer un index une seule fois pour une collection unique. Après la création initiale, MongoDB met automatiquement à jour l'index lors des modifications des données.

Lorsque l'exécution de createIndex() ne pose généralement aucun problème, si un index n'existe pas à cause d'un travail d'administration en cours, un appel à createIndex() peut perturber la disponibilité de la base de données. L'exécution de createIndex() peut rendre un replica set inaccessible lorsque la création de l'index a lieu. Voir Construire des index sur des replica set.

Mis à jour le 11 décembre 2016

Pour lister les index d'une collection, utilisez la méthode db.collection.getIndexes() ou une méthode similaire pour votre pilote.

Mis à jour le 11 décembre 2016

Pour vérifier la taille des index sur une collection, utilisez db.collection.stats().

Mis à jour le 11 décembre 2016

Lorsqu'un index est trop grand pour tenir dans la mémoire RAM, MongoDB doit lire l'index à partir du disque, ce qui est une opération beaucoup plus lente que la lecture depuis la RAM. Gardez à l'esprit qu'un indice peut être stocké dans la RAM lorsque votre serveur a assez de RAM disponible pour l'index et le reste du working set.

Dans certains cas, un index n'a pas besoin de tenir entièrement dans la RAM. Pour plus de détails, voir Index qui stockent uniquement les valeurs récentes dans la RAM.

Mis à jour le 11 décembre 2016

Pour inspecter comment MongoDB traite une requête, utilisez la méthode explain() du shell mongo, ou de votre pilote d'application.

Mis à jour le 11 décembre 2016

Un certain nombre de facteurs déterminent les champs à indexer, y compris la sélectivité, la capacité des index de s'adapter à la taille de la mémoire vive, la réutilisation des index dans plusieurs requêtes lorsque cela est possible et la création des index qui peuvent soutenir tous les champs dans une requête donnée. Pour une documentation détaillée sur le choix des champs à indexer, voir Tutoriels sur l'indexation.

Mis à jour le 11 décembre 2016

Toute opération d'écriture qui modifie un champ indexé nécessite une mise à jour de l'index en plus du document lui-même. Si la mise à jour d'un document provoque l'augmentation de la taille de celui-ci au-delà de la taille d'enregistrement allouée, MongoDB doit mettre à jour tous les indices compris dans ce document dans le cadre de l'opération de mise à jour.

Par conséquent, si votre demande est en écriture lourde, créer trop d'index pourrait affecter les performances.

Mis à jour le 11 décembre 2016

La construction d'un indice peut être une opération d'entrée/sortie intensive, surtout si vous avez une grande collection. Cela est vrai sur un système de base de données qui prend en charge les index secondaires, y compris MySQL. Si vous avez besoin de construire un index sur une grande collection, envisagez d'effectuer cette opération en arrière-plan. Voir Création d'index.

Si vous construisez un grand index sans l'option d'arrière-plan, et si cela fait que la base de données cesse de répondre, faites une des actions suivantes :

  • attendez la fin de la construction de l'indice ;
  • tuez l'opération en cours (voir db.killOp()). L'indice partiellement créé sera supprimé.

Mis à jour le 11 décembre 2016

Vous pouvez utiliser les méthodes min() et max() pour contraindre les résultats du curseur retourné par find() en utilisant des clés d'index.

Mis à jour le 11 décembre 2016

Les opérateurs $ne et $nin ne sont pas sélectifs. Voir Créer des requêtes qui assurent la sélectivité. Si vous avez besoin d'utiliser ceux-ci, il est souvent préférable de faire en sorte qu'un critère supplémentaire, plus sélectif, fasse partie de la requête.

Mis à jour le 11 décembre 2016

Pas entièrement. L'indice peut soutenir partiellement ces requêtes, car il peut accélérer la sélection du premier élément du tableau ; cependant, la comparaison de tous les éléments suivants du tableau ne peut pas utiliser l'index et doit parcourir les documents individuellement.

Mis à jour le 11 décembre 2016

Pour les recherches simples d'attributs qui ne nécessitent pas des ensembles de résultats triés ou des requêtes de plages, envisagez la création d'un champ qui contient un tableau de documents où chaque document dispose d'un champ (par exemple, attrib) qui stocke un type spécifique d'attribut. Vous pouvez indexer ce champ attrib.

Par exemple, le champ attrib dans le document suivant vous permet d'ajouter un nombre illimité de types d'attributs :

Code javascript : Sélectionner tout
1
2
3
4
5
6
7
8
{ _id : ObjectId(...), 
  attrib : [ 
            { k: "couleur",    v: "rouge" }, 
            { k: "forme":      v: "rectangle" }, 
            { k: "couleur":    v: "bleu" }, 
            { k: "disponible": v: true } 
           ] 
}
Les deux requêtes suivantes pourraient utiliser le même index {"attrib.k": 1, "attrib.v": 1} :

Code javascript : Sélectionner tout
1
2
db.mycollection.find( { attrib: { $elemMatch : { k: "couleur",    v: "bleu" } } } ) 
db.mycollection.find( { attrib: { $elemMatch : { k: "disponible", v: true } } } )

Mis à jour le 11 décembre 2016

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2020 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.