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

Perché PyMongo codifica uuid.uuid1() come BSON::Binary?

La serializzazione predefinita per un Python uuid utilizza un UUID rappresentazione binaria nella specifica BSON perché ciò garantisce un ordinamento coerente per le query di intervallo e utilizza anche meno spazio di archiviazione per dati/indici.

Ad esempio, queste tre stringhe sono equivalenti in esadecimale:

5d78ad35ea5f11e1a183705681b29c47
5D78AD35EA5F11E1A183705681B29C47
5d78ad35ea5f11e1A183705681B29C47

..ma hanno diversi tipi di ordinamento come stringhe:

> db.uuidsort.find().sort({_id:1})
{ "_id" : "5D78AD35EA5F11E1A183705681B29C47" }
{ "_id" : "5d78ad35ea5f11e1A183705681B29C47" }
{ "_id" : "5d78ad35ea5f11e1a183705681b29c47" }

Confrontando le dimensioni dei bson:

> db.uuidtest.find()
{ "_id" : BinData(3,"XXitNepfEeGhg3BWgbKcRw==") }
{ "_id" : "5d78ad35ea5f11e1a183705681b29c47" }

> Object.bsonsize(db.uuidtest.findOne({_id: BinData(3,"XXitNepfEeGhg3BWgbKcRw==")}))
31

> Object.bsonsize(db.uuidtest.findOne({_id: "5d78ad35ea5f11e1a183705681b29c47"}))
47

Se vuoi inserire come stringhe, puoi usare UUID.hex per ottenere l'equivalente della stringa di 32 caratteri:

>>> db.uuidtest.insert({'_id': uuid.hex})
'5d78ad35ea5f11e1a183705681b29c47'

Se vuoi trovare gli UUID per stringa da Python, puoi usare uuid. UUID metodi:

>>> db.uuidtest.find_one({'_id':uuid.UUID('5d78ad35ea5f11e1a183705681b29c47')})
{u'_id': UUID('5d78ad35-ea5f-11e1-a183-705681b29c47')}

Se vuoi trovare gli UUID per stringa da mongo shell, c'è un UUID() aiutante:

> db.uuidtest.find({_id:UUID('5d78ad35ea5f11e1a183705681b29c47')})
{ "_id" : BinData(3,"XXitNepfEeGhg3BWgbKcRw==") }

Nota:sono disponibili alcuni altri sottotipi UUID per l'interoperabilità con altre versioni di driver, come descritto in Documenti API per bson.binary .