Python 3 FAQ
PyMongo supports CPython 3.4+ and PyPy3.5+.
Only one intentional change. Instances of are encoded as BSON type 5 (Binary data) with subtype 0. In Python 3 they are decoded back to bytes. In Python 2 they are decoded to with subtype 0.
Now retrieve the same document in Python 2. Notice the byte string is decoded to Binary:
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymongo
>>> c.test.bintest.find_one()
{u'binary': Binary('this is a byte string', 0), u'_id': ObjectId('4f9086b1fba5222021000000')}
There is a similar change in behavior in parsing JSON binary with subtype 0. In Python 3 they are decoded into . In Python 2 they are decoded to Binary with subtype 0.
Now decode the same JSON in Python 2 . Notice the byte string is decoded to :
Python 2.7.10 (default, Feb 7 2017, 00:08:15)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> loads('{"b": {"$binary": "dGhpcyBpcyBhIGJ5dGUgc3RyaW5n", "$type": "00"}}')
{u'b': Binary('this is a byte string', 0)}
Instances of ObjectId pickled using Python 2 can always be unpickled using Python 3.
If you need to pickle ObjectIds using Python 3 and unpickle them using Python 2 you must use protocol <= 2
:
Python 3.6.5 (default, Jun 21 2018, 15:09:09)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from bson.objectid import ObjectId
>>> oid
ObjectId('4f96f20c430ee6bd06000000')
>>> pickle.dumps(oid, protocol=2)
b'\x80\x02cbson.objectid\nObjectId\nq\x00)\x81q\x01c_codecs\nencode\...'
Python 2.7.15 (default, Jun 21 2018, 15:00:48)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
ObjectId('4f96f20c430ee6bd06000000')