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

Hvorfor koder PyMongo uuid.uuid1() som en BSON::Binær?

Standardserialiseringen for en Python uuid bruger en UUID binær repræsentation i BSON-specifikationen fordi dette sikrer ensartet sortering af intervalforespørgsler og også bruger mindre lagerplads til data/indekser.

For eksempel er disse tre strenge ækvivalente i hex:

5d78ad35ea5f11e1a183705681b29c47
5D78AD35EA5F11E1A183705681B29C47
5d78ad35ea5f11e1A183705681B29C47

..men har forskellige sorteringsrækkefølger som strenge:

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

Sammenligning af bson-størrelser:

> 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

Hvis du vil indsætte som strenge, kan du bruge UUID.hex for at få den tilsvarende 32-tegns streng:

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

Hvis du vil finde UUID'er efter streng fra Python, kan du bruge uuid. UUID metoder:

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

Hvis du vil finde UUID'er efter streng fra mongo shell, er der en UUID() hjælper:

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

Bemærk:der er et par andre UUID-undertyper tilgængelige for interoperabilitet med andre driverversioner, som beskrevet i API-dokumenter til bson.binary .




  1. Flet to array-felter i mongoDB

  2. konfiguration max gammel pladsstørrelse i Nodejs

  3. Meteor - Hvorfor skal jeg bruge this.userId over Meteor.userId() når det er muligt?

  4. MongoDb-begrænset undersamling