MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Warum codiert PyMongo uuid.uuid1() als BSON::Binary?

Die Standard-Serialisierung für eine Python-uuid verwendet eine UUID binäre Darstellung in der BSON-Spezifikation da dies eine konsistente Sortierung für Bereichsabfragen gewährleistet und außerdem weniger Speicherplatz für Daten/Indizes benötigt.

Beispielsweise sind diese drei Zeichenfolgen in Hex äquivalent:

5d78ad35ea5f11e1a183705681b29c47
5D78AD35EA5F11E1A183705681B29C47
5d78ad35ea5f11e1A183705681B29C47

..haben aber unterschiedliche Sortierreihenfolgen als Strings:

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

Vergleich der bson-Größen:

> 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

Wenn Sie Strings einfügen möchten, können Sie UUID.hex verwenden um das 32-Zeichen-String-Äquivalent zu erhalten:

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

Wenn Sie UUIDs anhand von Zeichenfolgen in Python finden möchten, können Sie die uuid verwenden. UUID Methoden:

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

Wenn Sie UUIDs per Zeichenfolge aus dem mongo finden möchten Shell gibt es eine UUID() Helfer:

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

Hinweis:Es sind einige andere UUID-Subtypen für die Interoperabilität mit anderen Treiberversionen verfügbar, wie in API-Dokumentation für bson.binary .