sql >> Databasteknik >  >> NoSQL >> MongoDB

Varför den efterföljande 0x00-byten efter BSON-strängen (inte Cstring/ename)?

Resonemanget för både längden på strängen och nollterminatorn är tvåfaldigt:kompatibilitet med befintliga strängar av C-stil och prestanda.

För prestanda måste MongoDB snabbt kunna gå till ett specifikt fält i ett dokument utan att iterera genom hela BSON. Detta är viktigt särskilt om du letar efter ett fält som är nära slutet av ett stort (säg 16 MB) dokument. Med längden på strängen kodad som en av de första informationen om en strängtyp, kan den bara hoppa över det antalet byte och gå till nästa fält. Annars måste den iterera över hela strängen tills den hittar slutet på strängen.

För kompatibilitet är MongoDB skriven i C++, där strängar är nullterminerade . Det kan klippa av den nollterminatorn för att spara en byte eftersom längden är kodad, men att få den strängen ur BSON till ett format som är användbart av C++ skulle kräva att man slår på den null igen. Detta kommer att behöva specialiserad stränghanteringsrutin som är den enda fördelen är att spara en enda byte.

Sammantaget bestämdes det att "slösa bort" en enda byte är en acceptabel kompromiss.




  1. 5 sätt att få protokollet från ett datum i MongoDB

  2. NodeJS Mongo - Mongoose - Dynamiskt samlingsnamn

  3. db.collection.count() returnerar mycket fler dokument för fragmenterad insamling i MongoDB

  4. heroku mongohq och mongoid Mongo::ConnectionFailure