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

Ottieni BinData UUID da Mongo come stringa

La risposta alla tua domanda è più complicata di quanto ti aspetteresti! Il motivo principale per cui è complicato è che per ragioni storiche (purtroppo) diversi driver hanno scritto UUID nel database utilizzando ordini di byte diversi. Non menzioni quale driver stai utilizzando, ma userò il driver C# come esempio.

Supponiamo di utilizzare il codice seguente per inserire un documento:

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

Se poi esamino il documento usando la shell Mongo, appare così:

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

La shell Mongo ha una funzione incorporata chiamata hex che puoi usare per visualizzare il valore binario come una stringa esadecimale:

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

Osserva attentamente:l'ordine dei byte della stringa esadecimale non corrisponde al valore UUID originale utilizzato nel programma C#. Questo perché il driver C# utilizza l'ordine dei byte restituito dal metodo ToByteArray di Microsoft della classe Guid (che purtroppo restituisce i byte in un ordine bizzarro, fatto che non è stato scoperto per molti mesi). Gli altri guidatori hanno le loro idiosincrasie.

Per aiutare con questo abbiamo alcune funzioni di supporto scritte in Javascript che possono essere caricate nella shell Mongo. Sono definiti in questo file:

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

Alla shell Mongo può essere detto di elaborare un file all'avvio fornendo il nome del file sulla riga di comando (insieme all'argomento --shell). Dopo aver caricato questo file, abbiamo accesso a una serie di funzioni di supporto per creare e visualizzare valori BinData che sono UUID. Ad esempio:

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 }
>

In questo esempio la funzione toCSUUID viene utilizzata per visualizzare un valore BinData come CSUUID e la funzione CSUUID viene utilizzata per creare un valore BinData per un UUID utilizzando le convenzioni di ordinamento dei byte del driver C# in modo da poter eseguire query su un UUID. Esistono funzioni simili per gli altri driver (toJUUID, toPYUUID, JUUID, PYUUID).

Un giorno in futuro tutti i driver si standardizzeranno su un nuovo sottotipo binario 4 con un ordine di byte standard. Nel frattempo devi usare la funzione di supporto appropriata che corrisponde a qualsiasi driver tu stia utilizzando.