sql >> Base de Datos >  >> NoSQL >> MongoDB

Con mongodb y guids para la identificación de documentos, ¿cuál es la forma eficiente de almacenar los Guids para recuperar fácilmente el Guid real?

Trabajar con GUID tiene algunas dificultades, principalmente relacionadas con cómo trabajar con la representación binaria en el shell de mongo y también con accidentes históricos que dieron como resultado que diferentes controladores almacenaran GUID usando diferentes órdenes de bytes.

Usé el siguiente código para ilustrar los problemas:

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

que cuando lo ejecuté salió:

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

cuando muestro esto en el shell de mongo obtengo:

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

Tenga en cuenta que incluso cuando se muestra como hexadecimal, el orden de los bytes no coincide con el GUID original. Ese es el accidente histórico del que estaba hablando. Todos los bytes están ahí, simplemente están en un orden inusual gracias a la implementación de Guid.ToByteArray() de Microsoft.

Para ayudarlo a trabajar con GUID en el shell de mongo, puede copiar el siguiente archivo de funciones auxiliares en el directorio donde se almacena mongo.exe:

https://github.com/rstam/mongo-csharp -controlador/blob/maestro/uuidhelpers.js

El archivo tiene algunos breves comentarios de documentación en la parte superior que pueden resultarle útiles. Para que estas funciones estén disponibles en el shell de mongo, debe indicarle al shell de mongo que lea este archivo cuando se inicie. Vea la siguiente sesión de muestra:

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

También podría usar otra de las funciones auxiliares para consultar los GUID:

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

En cuanto al almacenamiento de sus GUID como cadenas, no es algo insólito y definitivamente hace que ver y consultar los datos en el shell de mongo sea más fácil y evita todos los problemas con diferentes órdenes de bytes. La única desventaja es que utiliza más espacio (aproximadamente el doble).