Est-il mauvais de changer le type d'id dans MongoDB en entier?

MongoDB utilise le type ObjectId pour _id.

Ce sera mauvais si je fais _id un entier incrémenté?

(avec cette gemme , Si vous êtes intéressé)

22
demandé sur Asya Kamsky 2012-12-27 16:03:00

2 réponses

Non, ce n'est pas mal du tout et en fait le OjbectId intégré est assez important dans l'index, donc si vous croyez avoir quelque chose de mieux, vous êtes plus que bienvenu pour changer la valeur par défaut du Champ _id.

Mais, et c'est un gros mais , Il y a quelques considérations au moment de décider de s'éloigner de la formulation par défaut ObjectId, en particulier lors de l'utilisation des _id d'incrémentation automatique comme indiqué ici: http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/#auto-increment-counters-collection

Le multi-threading n'est pas un gros problème parce que findAndModify et les verrous atomiques peuvent réellement s'occuper de cela, mais vous venez de frapper votre premier problème. findAndModify n'est pas la fonction la plus rapide ni la plus légère et il y a eu des baisses de performances significatives remarquées lors de son utilisation régulière.

Vous devez également tenir compte des frais généraux de le faire vous-même quoi qu'il en soit, même sans findAndModify. Pour chaque insertion que vous avez, vous devrez faire une requête supplémentaire. Image ayant un id unique que vous devez interroger l'unicité de chaque fois que vous voulez insérer, éventuellement votre taux d'insertion tombera à une analyse et votre verrou s'accumulera.

Bien sûr, le ObjectId est vraiment bon pour être unique sans avoir à vérifier ou formuler sa propre unicité en touchant la base de données avant l'insertion, donc il n'a pas cette surcharge.

Cela étant dit, il n'est pas la pire idée au monde et si vous pensez qu'elle suit votre scénario alors allez-y mais gardez à l'esprit que si vous n'avez pas besoin de l'ID d'incrémentation automatique, cela pourrait être un fardeau pour vous.

23
répondu Sammaye 2012-12-27 16:52:49

Vous pouvez le faire, mais vous êtes responsable de vous assurer que les entiers sont uniques.

MongoDB ne prend pas en charge les champs d'incrémentation automatique comme la plupart des bases de données SQL. Lorsque vous avez une application distribuée ou multithread qui a plusieurs processus et/ou threads qui créent de nouvelles entrées de base de données, vous devez vous assurer qu'ils utilisent le même compteur. Sinon, il pourrait arriver que deux threads essaient de stocker un document avec le même _id dans la base de données.

Lorsque cela se produit, un d'entre eux échouent. Cela signifie que vous devez attendre que la base de données renvoie un succès ou une erreur (en appelant GetLastError ou en définissant les préoccupations d'écriture sur acknowledged), ce qui prend plus de temps que d'envoyer des données de manière fire-and-forget.

9
répondu Philipp 2012-12-27 15:04:13