sql >> Databasteknik >  >> NoSQL >> MongoDB

Med mongodb och guider för dokumentens ID, vilket är ett effektivt sätt att lagra guiderna för att enkelt hämta den faktiska guiden?

Att arbeta med GUID har några fallgropar, mestadels relaterade till hur man arbetar med den binära representationen i mongoskalet och även till historiska olyckor som resulterade i att olika förare lagrade GUID med olika byteordningar.

Jag använde följande kod för att illustrera problemen:

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

som när jag körde det ut:

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

när jag visar detta i mongo-skalet får jag:

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

Observera att även när den visas som hex matchar inte byteordningen den ursprungliga GUID. Det var den historiska olyckan jag pratade om. Alla bytes finns där, de är bara i en ovanlig ordning tack vare Microsofts implementering av Guid.ToByteArray().

För att hjälpa dig att arbeta med GUID i mongo-skalet kan du kopiera följande fil med hjälpfunktioner till katalogen där mongo.exe är lagrad:

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

Filen har några korta dokumentationskommentarer överst som du kan ha nytta av. För att göra dessa funktioner tillgängliga i mongo-skalet måste du be mongo-skalet att läsa den här filen när den startar. Se följande exempelsession:

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 också använda en annan av hjälpfunktionerna för att fråga efter GUID:erna:

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

När det gäller att lagra dina GUID:er som strängar är det inte en ovanlig sak att göra och det gör definitivt visning och sökning av data i mongo-skalet lättare och undviker alla problem med olika byteordningar. Den enda nackdelen är att den använder mer utrymme (ungefär dubbelt).




  1. Kör mongodb-skalskript via C#-drivrutinen

  2. Generera PDF med JasperReports Library och MongoDB

  3. mongoose unik:sant fungerar inte

  4. Jämföra datum i Mongodb med C# LINQ-drivrutinen