web-dev-qa-db-fra.com

Différence entre createIndex () et assureIndex () dans Java using mongodb

Quelle est la différence entre createIndex() et ensureIndex() dans Java en utilisant MongoDB? J'ai cherché sur Google, mais je n'ai pas obtenu de réponse satisfaisante.

39
Amit Chahar

Mise à jour 2: La réponse d'origine, ainsi que la première mise à jour, référencent par erreur la documentation de Mongo Shell au lieu de Java = API.

En Java, DBCollection.ensureIndex() a été déconseillé dans la version 2.12 et supprimé dans la version 3.0. DBCollection.createIndex() est celui qui doit être utilisé.

Mise à jour:
db.collection.ensureIndex() est obsolète depuis la version 3.0.0.
Est maintenant un alias pour db.collection.createIndex () .

Original:
createIndex() est déconseillé depuis 1.8

Il a été utilisé pour créer des index sur les collections tandis que ensureIndex() crée un index sur le champ spécifié si l'index n'existe pas déjà. De plus, lorsque nous exécutons createIndex() deux fois, la deuxième exécution échouera alors qu'avec ensureIndex() vous pouvez l'invoquer plusieurs fois fois et il n'échouera pas

Et encore une chose qu'ils ont changé concernant le comportement de ensureIndex(), dans les versions précédentes de mongodb (versions inférieures à 2.6) si l'entrée d'index d'un document existant dépasse la longueur de clé d'index max an l'index serait créé mais Mongodb n'indexerait pas ces documents alors que dans la version récente aucun index ne serait créé .

28
sol4me

Dans l'API Java, DBCollection.ensureIndex() est obsolète, exactement l'inverse par rapport à l'API MongoDB "normale" (au moment de la réponse). Mise à jour : cette incohérence semble avoir été résolue depuis, et db.collection.createIndex() remplace désormais db.collection.ensureIndex() dans le Mongo Shell également.

Comme vous pouvez le voir dans https://jira.mongodb.org/browse/Java-1097 , dans Java (dont l'OP a demandé)) ensureIndex() était obsolète dans la version 2.12.0 du pilote Java, et DBCollection.createIndex() est celui que vous devez utiliser. DBCollection.ensureIndex() (lien vers la version 2.12) n'est plus disponible dans DBCollection Java API).

14
Jens Grivolla

La méthode ensureIndex trouvée dans le Java (v2.12 et versions antérieures) mettrait en cache l'existence ou non de l'index sur la collection. Étant donné que plusieurs clients pourraient potentiellement modifier les index sur une collection, la valeur du cache peut parfois être erronée et le pilote ne parviendrait pas à créer un index manquant.

Pour cette raison, le pilote Java Java a implémenté une méthode createIndex avec un comportement identique, sauf qu'il ne mettra pas en cache l'état de l'index.

Avec les pilotes 2.12 et versions ultérieures, vous pouvez remplacer ensureIndex par createIndex et vous attendre au même comportement, à l'exception de la performance hit où le pilote pensait auparavant que l'index existe déjà et retournerait sans envoyer le createIndex commande au serveur mongo.

Quant à savoir pourquoi ils n'ont pas changé le comportement sans renommer - que je n'ai aucune idée.

1
GaspardP

Déconseillé depuis la version> 3.0.0: db.collection.ensureIndex () est désormais un alias pour db.collection.createIndex ().

1
Surender Singh