sql >> Databáze >  >> NoSQL >> MongoDB

Proč koncový bajt 0x00 za řetězcem BSON (nikoli Cstring/ename)?

Důvod pro délku řetězce a nulového terminátoru je dvojí:kompatibilita se stávajícími řetězci ve stylu C a výkon.

Pro výkon musí být MongoDB schopen rychle přejít na konkrétní pole v dokumentu bez iterace přes celý BSON. To je důležité zejména v případě, že hledáte pole, které se blíží konci velkého (řekněme 16 MB) dokumentu. S délkou řetězce zakódovanou jako jedna z prvních informací o typu řetězce může tento počet bajtů jednoduše přeskočit a přejít na další pole. Jinak bude muset iterovat celý řetězec, dokud nenajde konec řetězce.

Kvůli kompatibilitě je MongoDB napsán v C++, kde jsou řetězce ukončeny nulou . Může odříznout tento nulový terminátor, aby se ušetřil jeden bajt, protože délka je zakódována, ale dostat tento řetězec z BSON do formátu použitelného v C++ by vyžadovalo znovu přichycení tohoto null. To bude vyžadovat specializovanou rutinu pro zpracování řetězců, jejíž jedinou výhodou je úspora jednoho bajtu.

Celkově bylo rozhodnuto, že „plýtvání“ jedním byte je přijatelným kompromisem.




  1. Jaký je rozdíl mezi changeStreamem a tabulkovým kurzorem v MongoDB

  2. Hromadná aktualizace/upsert v MongoDB?

  3. Jak používat proměnné s MongoDB $lookup

  4. V MongoDB používám velký dotaz, jak vytvořím složený index nebo jeden index, takže se mi zvýší doba odezvy