MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Pourquoi l'octet 0x00 à la fin après la chaîne BSON (pas Cstring/ename) ?

Le raisonnement pour la longueur de la chaîne et le terminateur nul est double :compatibilité avec les chaînes de style C existantes et performances.

Pour des raisons de performances, MongoDB doit pouvoir accéder rapidement à un champ spécifique d'un document sans parcourir l'ensemble du BSON. Ceci est important, surtout si vous recherchez un champ proche de la fin d'un document volumineux (disons 16 Mo). Avec la longueur de la chaîne codée comme l'une des premières informations sur un type de chaîne, il peut simplement ignorer ce nombre d'octets et passer au champ suivant. Sinon, il devra itérer sur toute la chaîne jusqu'à ce qu'il trouve la fin de la chaîne.

Pour des raisons de compatibilité, MongoDB est écrit en C++, où les chaînes sont à terminaison nulle . Il peut couper ce terminateur nul pour économiser un octet puisque la longueur est encodée, mais obtenir cette chaîne de BSON dans un format utilisable par C++ nécessiterait de reprendre ce null. Cela nécessitera une routine de traitement de chaîne spécialisée dont le seul avantage est d'économiser un seul octet.

Dans l'ensemble, il a été décidé que "gaspiller" un seul octet est un compromis acceptable.