sql >> Databasteknik >  >> NoSQL >> MongoDB

Varför kodar PyMongo uuid.uuid1() som en BSON::Binary?

Standardserialiseringen för en Python uuid använder en UUID binär representation i BSON-specifikationen eftersom detta säkerställer konsekvent sortering för intervallfrågor och dessutom använder mindre lagringsutrymme för data/index.

Till exempel är dessa tre strängar ekvivalenta i hex:

5d78ad35ea5f11e1a183705681b29c47
5D78AD35EA5F11E1A183705681B29C47
5d78ad35ea5f11e1A183705681B29C47

..men har olika sorteringsordningar som strängar:

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

Jämföra bson-storlekarna:

> 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

Om du vill infoga som strängar kan du använda UUID.hex för att få motsvarande sträng med 32 tecken:

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

Om du vill hitta UUID efter sträng från Python kan du använda uuid. UUID metoder:

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

Om du vill hitta UUID genom sträng från mongo skal, det finns en UUID() hjälpare:

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

Obs:det finns några andra UUID-undertyper tillgängliga för interoperabilitet med andra drivrutinsversioner, som beskrivs i API-dokument för bson.binary .




  1. Varför du fortfarande borde använda MMAPv1 Storage Engine för MongoDB

  2. Det finns ett sätt att upprätthålla referensintegritet i MongoDB

  3. Pymongo returnerar endast värden som lista

  4. infoga objekt i listan i mongodb-dokument