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