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

Obtener BinData UUID de Mongo como cadena

¡La respuesta a tu pregunta es más complicada de lo que esperas! La razón principal por la que es complicado es que, por razones históricas (desafortunadamente), diferentes controladores han escrito UUID en la base de datos utilizando diferentes órdenes de bytes. No menciona qué controlador está usando, pero usaré el controlador C# como ejemplo.

Supongamos que uso el siguiente código para insertar un documento:

var guid = new Guid("00112233-4455-6677-8899-aabbccddeeff");
collection.Insert(new BsonDocument {
    { "_id", guid },
    { "x", 1 }
});

Si luego examino el documento usando el shell de Mongo, se ve así:

> db.test.findOne()
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
>

El shell de Mongo tiene una función integrada llamada hexadecimal que puede usar para mostrar el valor binario como una cadena hexadecimal:

> var doc = db.test.findOne()
> doc._id.hex()
33221100554477668899aabbccddeeff
>

Mire con atención:el orden de bytes de la cadena hexadecimal no coincide con el valor UUID original utilizado en el programa C#. Esto se debe a que el controlador de C# usa el orden de bytes devuelto por el método ToByteArray de Microsoft de la clase Guid (que lamentablemente devuelve los bytes en un orden extraño, hecho que no se descubrió durante muchos meses). Otros conductores tienen sus propias idiosincrasias.

Para ayudar con esto, tenemos algunas funciones auxiliares escritas en Javascript que se pueden cargar en el shell de Mongo. Están definidos en este archivo:

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

Se le puede indicar al shell de Mongo que procese un archivo cuando se inicia proporcionando el nombre del archivo en la línea de comandos (junto con el argumento --shell). Una vez cargado este archivo, tenemos acceso a una serie de funciones auxiliares para crear y mostrar valores BinData que son UUID. Por ejemplo:

C:\mongodb\mongodb-win32-x86_64-2.0.1\bin>mongo --shell uuidhelpers.js
MongoDB shell version: 2.0.1
connecting to: test
type "help" for help
> var doc = db.test.findOne()
> doc._id.toCSUUID()
CSUUID("00112233-4455-6677-8899-aabbccddeeff")
> db.test.find({_id : CSUUID("00112233-4455-6677-8899-aabbccddeeff")})
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
>

En este ejemplo, la función toCSUUID se usa para mostrar un valor BinData como un CSUUID y la función CSUUID se usa para crear un valor BinData para un UUID usando las convenciones de ordenación de bytes del controlador C# para que podamos consultar un UUID. Hay funciones similares para los otros controladores (toJUUID, toPYUUID, JUUID, PYUUID).

Algún día en el futuro, todos los controladores se estandarizarán en un nuevo subtipo binario 4 con un orden de bytes estándar. Mientras tanto, debe utilizar la función auxiliar adecuada que coincida con el controlador que esté utilizando.