Je suis un peu confus par l'utilisation des ObjectIds par Mongo DB. Bien sûr, ils sont parfaits pour créer des ID côté client qui ne sont presque certainement pas en conflit avec d'autres ID créés côté client. Mais mongo semble les stocker d'une manière spéciale. Le stockage d'une représentation sous forme de chaîne de l'ID est différent par rapport au stockage d'un ID d'objet en tant qu'objet. Pourquoi est-ce?
La forme chaîne n'a-t-elle pas toutes les mêmes informations que la forme objet? Pourquoi mongo va-t-il aussi loin pour différencier ces deux formes? Cela me gâche quand j'essaie de comparer les _ids envoyés depuis un frontend par exemple. Ma base de données n'est en aucun cas cohérente avec le fait qu'elle stocke des identifiants sous forme de chaîne ou des identifiants sous forme d'objet, et que mon code soit certainement partiellement à blâmer, je blâme surtout Mongo pour avoir rendu cela si étrange.
Ai-je tort que c'est bizarre? Pourquoi mongo fait-il de cette façon?
Personnellement, je blâme votre code. Je contourne parfaitement ce problème dans mes applications en codant de la bonne façon. Je convertis en chaîne dans le code à comparer et je m'assure que tout ce qui ressemble à un ObjectId
est réellement utilisé comme ObjectId
.
Il est bon de noter qu'entre le ObjectId
( http://docs.mongodb.org/manual/reference/object-id/ ) et sa représentation hexadécimale il y a en fait 12 octets de différence, le ObjectId
étant de 12 octets et sa représentation hexadécimale étant de 24.
Il ne s'agit pas seulement de l'efficacité du stockage mais aussi des index; non seulement parce qu'ils sont plus petits, mais aussi parce que le ObjectId
peut être utilisé d'une manière spéciale pour garantir que seules des parties de l'index sont chargées; les pièces utilisées. Cela devient plus visible lors de l'insertion, où seule la dernière partie de cet index doit être chargée pour garantir l'unicité. Vous ne pouvez pas garantir un tel comportement avec sa représentation hexadécimale.
Je vous recommande fortement de ne pas utiliser la représentation hexadécimale de OjbectId
. Si vous voulez "vous faciliter la vie", vous feriez mieux de créer un autre _id
qui est plus petit mais tout aussi unique et convivial pour les index.
ObjectId
fait 12 octets lorsqu'il est stocké en interne, ce qui est plus compact que sa représentation sous forme de chaîne hexadécimale. Les deux choses sont différentes.
Vous pouvez redistribuer l'intégralité de votre base de données et utiliser un uniforme _id
champ pour résoudre ce problème et assurez-vous que votre code est enregistré dans le même format. ObjectId
sont rapides à générer par MongoDB, donc je l'utiliserais lors de la création de nouveaux documents.