MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Com mongodb e guids para o ID de documentos, qual é a maneira eficiente de armazenar os Guids para recuperar facilmente o Guid real?


Trabalhar com GUIDs tem algumas armadilhas, principalmente relacionadas a como trabalhar com a representação binária no shell mongo e também a acidentes históricos que resultaram em diferentes drivers armazenando GUIDs usando ordens de bytes diferentes.

Eu usei o seguinte código para ilustrar os problemas:
var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);

que quando eu executei a saída:
Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be

quando eu exponho isso no shell do mongo, recebo:
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>

Observe que, mesmo quando exibido como hexadecimal, a ordem dos bytes não corresponde ao GUID original. Esse é o acidente histórico do qual eu estava falando. Todos os bytes estão lá, eles estão em uma ordem incomum graças à implementação de Guid.ToByteArray() da Microsoft.

Para ajudá-lo a trabalhar com GUIDs no shell do mongo, você pode copiar o seguinte arquivo de funções auxiliares para o diretório onde o mongo.exe está armazenado:

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

O arquivo tem alguns breves comentários de documentação na parte superior que podem ser úteis. Para disponibilizar essas funções no shell do mongo, você precisa dizer ao shell do mongo para ler este arquivo enquanto ele é inicializado. Veja a seguinte sessão de amostra:
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")
>

Você também pode usar outra das funções auxiliares para consultar os GUIDs:
> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>

No que diz respeito ao armazenamento de seus GUIDs como strings, isso não é algo inédito e definitivamente facilita a visualização e consulta dos dados no shell mongo e evita todos os problemas com diferentes ordens de bytes. A única desvantagem é que ele usa mais espaço (aproximadamente o dobro).