sql >> Database teknologi >  >> NoSQL >> MongoDB

Med mongodb og guider til dokumentets id, hvad er en effektiv måde at gemme guiderne for nemt at hente den faktiske guide?

Arbejdet med GUID'er har et par faldgruber, for det meste relateret til, hvordan man arbejder med den binære repræsentation i mongo-skallen og også til historiske ulykker, som resulterede i, at forskellige drivere lagrede GUID'er ved hjælp af forskellige byte-rækkefølger.

Jeg brugte følgende kode til at illustrere problemerne:

var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);

som da jeg kørte det output:

Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be

når jeg viser dette i mongo-skallen, får jeg:

> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>

Bemærk, at selv når den vises som hex, svarer byterækkefølgen ikke til den originale GUID. Det var den historiske ulykke, jeg talte om. Alle bytes er der, de er bare i en usædvanlig rækkefølge takket være Microsofts implementering af Guid.ToByteArray().

For at hjælpe dig med at arbejde med GUID'er i mongo-skallen kan du kopiere følgende fil med hjælpefunktioner til den mappe, hvor mongo.exe er gemt:

https://github.com/rstam/mongo-csharp -driver/blob/master/uuidhelpers.js

Filen har nogle korte dokumentationskommentarer øverst, som du måske kan finde nyttige. For at gøre disse funktioner tilgængelige i mongo-skallen skal du bede mongo-skallen læse denne fil, når den starter op. Se følgende eksempelsession:

C:\mongodb\mongodb-win32-x86_64-2.0.6\bin>mongo --shell uuidhelpers.js
MongoDB shell version: 2.0.6
connecting to: test
type "help" for help
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
> doc._id.toCSUUID()
CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")
>

Du kan også bruge en anden af ​​hjælpefunktionerne til at forespørge efter GUID'erne:

> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>

For så vidt angår lagring af dine GUID'er som strenge, er det ikke en uhørt ting at gøre, og det gør bestemt visning og forespørgsel på dataene i mongo-skallen nemmere og undgår alle problemer med forskellige byte-rækkefølger. Den eneste ulempe er, at den bruger mere plads (omtrent dobbelt).




  1. Sådan laver du korrekt databasetest (TDD) på Rails 3 ved hjælp af MongoDB og Mongoid

  2. MongoDB:Kopiering af et array til et andet array i det samme dokument

  3. Azure Redis-cache - timeouts på GET-opkald

  4. Template Render overfører ikke pymongo aggregerede variabel til skabelonen