sql >> Databáze >  >> NoSQL >> MongoDB

Proč PyMongo kóduje uuid.uuid1() jako BSON::Binary?

Výchozí serializace pro Python uuid používá UUID binární reprezentace ve specifikace BSON protože to zajišťuje konzistentní řazení pro dotazy na rozsah a také spotřebovává méně místa pro data/indexy.

Například tyto tři řetězce jsou ekvivalentní v šestnáctkové soustavě:

5d78ad35ea5f11e1a183705681b29c47
5D78AD35EA5F11E1A183705681B29C47
5d78ad35ea5f11e1A183705681B29C47

..ale mají různé pořadí řazení jako řetězce:

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

Porovnání velikostí 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

Pokud chcete vložit jako řetězce, můžete použít UUID.hex získat ekvivalent 32znakového řetězce:

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

Pokud chcete najít UUID podle řetězce z Pythonu, můžete použít uuid. UUID metody:

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

Pokud chcete najít UUID podle řetězce z mongo shell, existuje UUID() pomocník:

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

Poznámka:Pro interoperabilitu s jinými verzemi ovladačů je k dispozici několik dalších podtypů UUID, jak je popsáno v Dokumenty API pro bson.binary .




  1. Mongo a najít vždy omezeno na 100 s geografickými daty

  2. Protokolujte dotazy MongoDB pomocí Spring Boot

  3. Jak může Python pozorovat změny v Mongodb's Oplog

  4. Docker [Errno 111] Připojit volání se nezdařilo ('127.0.0.1', 6379)