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

Con mongodb e guid per l'ID dei documenti, qual è un modo efficiente per archiviare i Guid per recuperare facilmente il Guid effettivo?

L'utilizzo dei GUID presenta alcune insidie, principalmente legate a come lavorare con la rappresentazione binaria nella mongo shell e anche a incidenti storici che hanno portato diversi driver a memorizzare GUID utilizzando ordini di byte diversi.

Ho usato il codice seguente per illustrare i problemi:

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

che quando l'ho eseguito ha prodotto:

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

quando visualizzo questo nella mongo shell ottengo:

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

Si noti che anche se visualizzato come esadecimale, l'ordine dei byte non corrisponde al GUID originale. Questo è l'incidente storico di cui parlavo. Tutti i byte sono lì, sono solo in un ordine insolito grazie all'implementazione di Guid.ToByteArray() da parte di Microsoft.

Per aiutarti a lavorare con i GUID nella mongo shell puoi copiare il seguente file di funzioni di supporto nella directory in cui è archiviato mongo.exe:

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

Il file contiene alcuni brevi commenti sulla documentazione nella parte superiore che potresti trovare utili. Per rendere disponibili queste funzioni nella mongo shell è necessario dire alla mongo shell di leggere questo file all'avvio. Vedere la seguente sessione di esempio:

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")
>

Puoi anche usare un'altra delle funzioni di supporto per interrogare i GUID:

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

Per quanto riguarda la memorizzazione dei GUID come stringhe, non è una cosa inaudita da fare e rende sicuramente più semplice la visualizzazione e l'interrogazione dei dati nella shell mongo ed evita tutti i problemi con ordini di byte diversi. L'unico svantaggio è che occupa più spazio (all'incirca il doppio).