PyMongo 4迁移指南#

PyMongo 4.0带来了许多改进,同时也带来了一些突破性的变化。本指南提供了将现有应用程序从PyMongo 3.x迁移到4.x或编写同时支持PyMongo 3.x和4.x的库的路线图。

《白夜追凶3》#

任何成功迁移的第一步都需要升级到或至少需要升级到最新版本的PyMongo 3.x。如果您的项目有Requirements s.txt文件,请添加“pymongo>=3.12,<4.0”行,直到您完全迁移到PyMongo 4为止。PyMongo 4.0中的大多数关键新方法和选项都已在PyMongo 3.12中向后移植,从而使迁移更加容易。

备注

希望升级到4.x的PyMongo 2.x用户必须首先升级到PyMongo 3.x,方法是遵循 PyMongo 3 Migration Guide

Python3.6+#

PyMongo 4.0不再支持Python2.7、3.4和3.5。想要升级到4.x的用户必须首先升级到3.6.2+。从Python2升级的用户应该参考 Python 3常见问题解答

启用弃用警告#

DeprecationWarning 是由PyMongo 4.0中删除的大多数方法引发的。确保启用运行时警告,以查看应用程序中使用了已弃用的函数和方法的位置:

python -Wd <your application>

警告也可以更改为错误::

python -Wd -Werror <your application>

备注

并非所有不推荐使用的功能都会引发 DeprecationWarning 在使用的时候。看见 Removed features with no migration path

MongoReplicaSetClient#

已删除 MongoReplicaSetClient 。从PyMongo 3.0开始, MongoReplicaSetClient 已完全相同于 pymongo.mongo_client.MongoClient 。应用程序只需替换 MongoReplicaSetClient 使用 pymongo.mongo_client.MongoClient 并得到相同的行为。

MongoClient#

directConnection 缺省值为False#

directConnection URI选项和关键字参数 MongoClient 默认为 False 而不是 None ,允许自动发现副本集。这意味着,如果您想要直接连接到单个服务器,则必须通过 directConnection=True 作为URI选项或关键字参数。

如果你看到任何 ServerSelectionTimeoutError 从PyMongo 3升级到4.x后,您可能需要添加 directConnection=True 在创建客户端时。以下是一些错误示例:

pymongo.errors.ServerSelectionTimeoutError: mongo_node2: [Errno 8] nodename nor servname
provided, or not known,mongo_node1:27017
ServerSelectionTimeoutError: No servers match selector "Primary()", Timeout: 30s,
Topology Description: ...

此外,在以下情况下,服务器发回的Hello命令的“isWritablePrimary”属性将始终为True directConnection=False **

>>> client.admin.command('hello')['isWritablePrimary']
True

将删除waitQueueMultiple参数#

删除了 waitQueueMultiple 关键字参数为 MongoClient 并被移除 pymongo.errors.ExceededMaxWaiters 。与其使用 waitQueueMultiple 若要限制队列,请限制应用程序中线程池的大小。

将删除socketKeepAlive参数#

删除了 socketKeepAlive 关键字参数为 MongoClient 。现在,PyMongo始终启用TCP Keep Alive。有关更多信息,请参阅 documentation

已重命名的URI选项#

几个不推荐使用的URI选项已重命名为 URI options specification 。下表汇总了旧的选项名称及其重命名的等价物。一些重命名的选项与被替换的选项具有不同的语义,如“迁移说明”一栏中所述。

旧URI选项

已重命名的URI选项

迁移说明

ssl_pem_passphrase

Tls认证密钥文件密码

ssl_ca_certs

TlsCAFile

ssl_crlfile

TlsCRL文件

ssl_match_hostname

TlsAllowInvalidHostname

ssl_match_hostname=True 相当于 tlsAllowInvalidHostnames=False 反之亦然。

ssl_cert_reqs

TlsAllowInvalid证书

而不是 ssl.CERT_NONEssl.CERT_OPTIONALssl.CERT_REQUIRED ,新选项需要布尔值- True 相当于 ssl.CERT_NONE ,而 False 相当于 ssl.CERT_REQUIRED

ssl_certfile

Tls认证密钥文件

Instead of using ssl_certfile and ssl_keyfile to specify the certificate and private key files respectively, use tlsCertificateKeyFile to pass a single file containing both the client certificate and the private key.

ssl_keyfile

J

日记本

WTimeout

WTimeoutMS

MongoClient.fsync已删除#

已删除 pymongo.mongo_client.MongoClient.fsync() 。运行 fsync command 直接与 command() 取而代之的是。例如::

client.admin.command('fsync', lock=True)

MongoClient.unlock已删除#

已删除 pymongo.mongo_client.MongoClient.unlock() 。运行 fsyncUnlock command 直接与 command() 取而代之的是。例如::

client.admin.command('fsyncUnlock')

MongoClient.IS_LOCKED已删除#

已删除 pymongo.mongo_client.MongoClient.is_locked 。运行 currentOp command 直接与 command() 取而代之的是。例如::

is_locked = client.admin.command('currentOp').get('fsyncLock')

MongoClient.database_NAMES已删除#

已删除 pymongo.mongo_client.MongoClient.database_names() 。使用 list_database_names() 取而代之的是。代码如下::

names = client.database_names()

可以更改为::

names = client.list_database_names()

MongoClient.max_bson_size/max_message_size/max_write_batch_size已删除#

已删除 pymongo.mongo_client.MongoClient.max_bson_sizepymongo.mongo_client.MongoClient.max_message_size ,以及 pymongo.mongo_client.MongoClient.max_write_batch_size 。这些助手在进入时是不正确的 loadBalanced=true mode 并且在具有混合版本的集群中不明确。使用 hello command 以从远程服务器获取权威值。代码如下::

max_bson_size = client.max_bson_size
max_message_size = client.max_message_size
max_write_batch_size = client.max_write_batch_size

可以更改为::

doc = client.admin.command('hello')
max_bson_size = doc['maxBsonObjectSize']
max_message_size = doc['maxMessageSizeBytes']
max_write_batch_size = doc['maxWriteBatchSize']

删除MongoClient.Event_Listeners和其他配置选项帮助器#

将删除以下客户端配置选项帮助器:- pymongo.mongo_client.MongoClient.event_listeners 。- pymongo.mongo_client.MongoClient.max_pool_size 。- pymongo.mongo_client.MongoClient.max_idle_time_ms 。- pymongo.mongo_client.MongoClient.local_threshold_ms 。- pymongo.mongo_client.MongoClient.server_selection_timeout 。- pymongo.mongo_client.MongoClient.retry_writes 。- pymongo.mongo_client.MongoClient.retry_reads

这些帮手已经被替换为 pymongo.mongo_client.MongoClient.options 。代码如下::

client.event_listeners
client.local_threshold_ms
client.server_selection_timeout
client.max_pool_size
client.min_pool_size
client.max_idle_time_ms

可以更改为::

client.options.event_listeners
client.options.local_threshold_ms
client.options.server_selection_timeout
client.options.pool_options.max_pool_size
client.options.pool_options.min_pool_size
client.options.pool_options.max_idle_time_seconds

tz_aware defaults to False#

这个 tz_aware 参数为 JSONOptions 现在默认为 False 而不是 Truebson.json_util.loads() 现在默认情况下将DateTime解码为naive::

>>> from bson import json_util
>>> s = '{"dt": {"$date": "2022-05-09T17:54:00Z"}}'
>>> json_util.loads(s)
{'dt': datetime.datetime(2022, 5, 9, 17, 54)}

保留PyMongo 3行为集 tz_aware=True ,例如::

>>> from bson import json_util
>>> opts = json_util.JSONOptions(tz_aware=True)
>>> s = '{"dt": {"$date": "2022-05-09T17:54:00Z"}}'
>>> json_util.loads(s, json_options=opts)
{'dt': datetime.datetime(2022, 5, 9, 17, 54, tzinfo=<bson.tz_util.FixedOffset object at 0x7fd1ebc1add0>)}

进行此更改是为了匹配的默认行为 CodecOptionsbson.decode

MongoClient在以下时间后无法执行操作 close()#

MongoClient 关闭后不能执行任何操作。之前的行为将简单地重新连接。但是,现在您必须创建一个新实例。

当提供多个URI时,MongoClient会引发异常#

MongoClient 现在引发一个 ConfigurationError 当多个URI传递到 hosts 争论。

在登录信息中给出未转义的百分号时,MongoClient会引发异常#

MongoClient 现在引发一个 InvalidURI 当它在用户名和密码中遇到未转义的百分号时发生异常。

数据库#

将删除Database.vernate和Database.logout#

已删除 pymongo.database.Database.authenticate()pymongo.database.Database.logout() 。在同一客户端上对多个用户进行身份验证与MongoDB 3.6+中对逻辑会话的支持冲突。要作为多个用户进行身份验证,请创建多个实例 MongoClient 。代码如下::

client = MongoClient()
client.admin.authenticate('user1', 'pass1')
client.admin.authenticate('user2', 'pass2')

可以更改为::

client1 = MongoClient(username='user1', password='pass1')
client2 = MongoClient(username='user2', password='pass2')

或者,创建包含应用程序所需的所有身份验证权限的单个用户。

已删除Database.Collection_NAMES#

已删除 pymongo.database.Database.collection_names() 。使用 list_collection_names() 取而代之的是。代码如下::

names = client.collection_names()
non_system_names = client.collection_names(include_system_collections=False)

可以更改为::

names = client.list_collection_names()
non_system_names = client.list_collection_names(filter={"name": {"$regex": r"^(?!system\\.)"}})

已删除Database.Current_op#

已删除 pymongo.database.Database.current_op() 。使用 aggregate() 相反,使用 $currentOp aggregation pipeline stage 。代码如下::

ops = client.admin.current_op()['inprog']

可以更改为::

ops = list(client.admin.aggregate([{'$currentOp': {}}]))

将删除Database.addUser#

已删除 pymongo.database.Database.add_user() 这在PyMongo 3.6中已被弃用。使用 createUser commandupdateUser command 取而代之的是。要创建用户::

db.command("createUser", "admin", pwd="password", roles=["dbAdmin"])

要创建只读用户:

db.command("createUser", "user", pwd="password", roles=["read"])

要更改密码::

db.command("updateUser", "user", pwd="newpassword")

或更改角色:

db.command("updateUser", "user", roles=["readWrite"])

将删除Database.Remove_User#

已删除 pymongo.database.Database.remove_user() 这在PyMongo 3.6中已被弃用。使用 dropUser command 相反::

db.command("dropUser", "user")

数据库.配置文件_级别已删除#

已删除 pymongo.database.Database.profiling_level() 这在PyMongo 3.12中已被弃用。使用 profile command 取而代之的是。代码如下::

level = db.profiling_level()

可以更改为::

profile = db.command('profile', -1)
level = profile['was']

将删除Database.set_PROFILING_LEVEL#

已删除 pymongo.database.Database.set_profiling_level() 这在PyMongo 3.12中已被弃用。使用 profile command 取而代之的是。代码如下::

db.set_profiling_level(pymongo.ALL, filter={'op': 'query'})

可以更改为::

res = db.command('profile', 2, filter={'op': 'query'})

数据库配置文件_INFO已删除#

已删除 pymongo.database.Database.profiling_info() 这在PyMongo 3.12中已被弃用。查询 'system.profile' collection 取而代之的是。代码如下::

profiling_info = db.profiling_info()

可以更改为::

profiling_info = list(db['system.profile'].find())

Database.__bool__ 引发未实现的错误#

Database 现在在作为布尔值求值时引发错误。代码如下::

if database:

可以更改为::

if database is not None:

现在,您必须显式地与NONE进行比较。

集合#

Collection.Aggregate的useCursor选项已删除#

删除了 useCursor 选项 aggregate() 这在PyMongo 3.6中已被弃用。该选项仅在从MongoDB 2.4升级到MongoDB 2.6时才是必需的。

Collection.Insert已删除#

已删除 pymongo.collection.Collection.insert() 。使用 insert_one()insert_many() 取而代之的是。

代码如下::

collection.insert({'doc': 1})
collection.insert([{'doc': 2}, {'doc': 3}])

可以更改为::

collection.insert_one({'my': 'document'})
collection.insert_many([{'doc': 2}, {'doc': 3}])

Collection.save已删除#

已删除 pymongo.collection.Collection.save() 。应用程序将获得更好的性能 insert_one() 要插入新文档并执行以下操作 update_one() 要更新现有文档,请执行以下操作。代码如下::

doc = collection.find_one({"_id": "some id"})
doc["some field"] = <some value>
db.collection.save(doc)

可以更改为::

result = collection.update_one({"_id": "some id"}, {"$set": {"some field": <some value>}})

如果性能不是问题,重构是站不住脚的, save 可以像这样实现::

def save(doc):
    if '_id' in doc:
        collection.replace_one({'_id': doc['_id']}, doc, upsert=True)
        return doc['_id']
    else:
        res = collection.insert_one(doc)
        return res.inserted_id

Collection.UPDATE已删除#

已删除 pymongo.collection.Collection.update() 。使用 update_one() 要更新单个文档或 update_many() 更新多个文档。代码如下::

collection.update({}, {'$set': {'a': 1}})
collection.update({}, {'$set': {'b': 1}}, multi=True)

可以更改为::

collection.update_one({}, {'$set': {'a': 1}})
collection.update_many({}, {'$set': {'b': 1}})

Collection.Remove已删除#

已删除 pymongo.collection.Collection.remove() 。使用 delete_one() 要删除单个文档或 delete_many() 要删除多个文档,请执行以下操作。代码如下::

collection.remove({'a': 1}, multi=False)
collection.remove({'b': 1})

可以更改为::

collection.delete_one({'a': 1})
collection.delete_many({'b': 1})

Collection.find_and_Modify已删除#

已删除 pymongo.collection.Collection.find_and_modify() 。使用 find_one_and_update()find_one_and_replace() ,或 find_one_and_delete() 取而代之的是。代码如下::

updated_doc = collection.find_and_modify({'a': 1}, {'$set': {'b': 1}})
replaced_doc = collection.find_and_modify({'b': 1}, {'c': 1})
deleted_doc = collection.find_and_modify({'c': 1}, remove=True)

可以更改为::

updated_doc = collection.find_one_and_update({'a': 1}, {'$set': {'b': 1}})
replaced_doc = collection.find_one_and_replace({'b': 1}, {'c': 1})
deleted_doc = collection.find_one_and_delete({'c': 1})

Collection.count和Cursor.count已删除#

已删除 pymongo.collection.Collection.count()pymongo.cursor.Cursor.count() 。使用 count_documents()estimated_document_count() 取而代之的是。代码如下::

ntotal = collection.count({})
nmatched = collection.count({'price': {'$gte': 10}})
# Or via the Cursor.count api:
ntotal = collection.find({}).count()
nmatched = collection.find({'price': {'$gte': 10}}).count()

可以更改为::

ntotal = collection.estimated_document_count()
nmatched = collection.count_documents({'price': {'$gte': 10}})

备注

当从迁移时 count()count_documents() 必须替换以下查询运算符:

运算符

更换

$Where

$expr

$NEAR

$geoWithin with $center; i.e. {'$geoWithin': {'$center': [[<x>,<y>], <radius>]}}

$NEARE球体

$geoWithin with $centerSphere; i.e. {'$geoWithin': {'$centerSphere': [[<x>,<y>], <radius>]}}

Collection.Initialize_Ordered_Bulk_op和Initialize_Unordered_Bulk_op被删除#

已删除 pymongo.collection.Collection.initialize_ordered_bulk_op()pymongo.bulk.BulkOperationBuilder 。使用 pymongo.collection.Collection.bulk_write() 取而代之的是。代码如下::

batch = coll.initialize_ordered_bulk_op()
batch.insert({'a': 1})
batch.find({'a': 1}).update_one({'$set': {'b': 1}})
batch.find({'a': 2}).upsert().replace_one({'b': 2})
batch.find({'a': 3}).remove()
result = batch.execute()

可以更改为::

coll.bulk_write([
    InsertOne({'a': 1}),
    UpdateOne({'a': 1}, {'$set': {'b': 1}}),
    ReplaceOne({'a': 2}, {'b': 2}, upsert=True),
    DeleteOne({'a': 3}),
])

Collection.Initialize_Unordered_Bulk_op已删除#

已删除 pymongo.collection.Collection.initialize_unordered_bulk_op() 。使用 pymongo.collection.Collection.bulk_write() 取而代之的是。代码如下::

batch = coll.initialize_unordered_bulk_op()
batch.insert({'a': 1})
batch.find({'a': 1}).update_one({'$set': {'b': 1}})
batch.find({'a': 2}).upsert().replace_one({'b': 2})
batch.find({'a': 3}).remove()
result = batch.execute()

可以更改为::

coll.bulk_write([
    InsertOne({'a': 1}),
    UpdateOne({'a': 1}, {'$set': {'b': 1}}),
    ReplaceOne({'a': 2}, {'b': 2}, upsert=True),
    DeleteOne({'a': 3}),
], ordered=False)

Collection.group已删除#

已删除 pymongo.collection.Collection.group() 。此方法在PyMongo 3.5中已弃用。MongoDB 4.2删除了 group command 。使用 aggregate()$group 而是上台表演。

Collection.map_Reduced和Collection.inline_map_Reduce将被删除#

已删除 pymongo.collection.Collection.map_reduce()pymongo.collection.Collection.inline_map_reduce() 。迁移到 aggregate() 或运行 mapReduce command 直接与 command() 取而代之的是。有关此迁移的更多指导,请参阅:

Collection.确保已删除_INDEX#

已删除 pymongo.collection.Collection.ensure_index() 。使用 create_index()create_indexes() 取而代之的是。请注意 ensure_index 维护最近创建的索引的内存缓存,而较新的方法没有。应用程序应避免频繁调用 create_index()create_indexes() 。代码如下::

def persist(self, document):
    collection.ensure_index('a', unique=True)
    collection.insert_one(document)

可以更改为::

def persist(self, document):
    if not self.created_index:
        collection.create_index('a', unique=True)
        self.created_index = True
    collection.insert_one(document)

Collection.reindex已删除#

已删除 pymongo.collection.Collection.reindex() 。运行 reIndex command 直接取而代之。代码如下::

>>> result = database.my_collection.reindex()

可以更改为::

>>> result = database.command('reIndex', 'my_collection')

将移除修改器参数#

删除了 modifiers 参数来自 find()find_one()find_raw_batches() ,以及 Cursor() 。而是将选项直接传递给该方法。代码如下::

cursor = coll.find({}, modifiers={
    "$comment": "comment",
    "$hint": {"_id": 1},
    "$min": {"_id": 0},
    "$max": {"_id": 6},
    "$maxTimeMS": 6000,
    "$returnKey": False,
    "$showDiskLoc": False,
})

可以更改为::

cursor = coll.find(
    {},
    comment="comment",
    hint={"_id": 1},
    min={"_id": 0},
    max={"_id": 6},
    max_time_ms=6000,
    return_key=False,
    show_record_id=False,
)

对于min/max,提示参数是必需的#

这个 hint 选项现在是必填项 minmax 查询使用 find() 以确保查询使用正确的索引。例如,代码如下::

cursor = coll.find({}, min={'x', min_value})

可以更改为::

cursor = coll.find({}, min={'x', min_value}, hint=[('x', ASCENDING)])

Collection.__bool__ 引发未实现的错误#

Collection 现在在作为布尔值求值时引发错误。代码如下::

if collection:

可以更改为::

if collection is not None:

现在,您必须显式地与NONE进行比较。

Collection.find返回带有空投影的整个文档#

Empty projections (eg {} or []) for find(), and find_one() are passed to the server as-is rather than the previous behavior which substituted in a projection of {"_id": 1}. This means that an empty projection will now return the entire document, not just the "_id" field. To ensure that behavior remains consistent, code like this:

coll.find({}, projection={})

可以更改为::

coll.find({}, projection={"_id":1})

已删除SONManipator#

已删除 pymongo.son_manipulatorpymongo.son_manipulator.SONManipulatorpymongo.son_manipulator.ObjectIdInjectorpymongo.son_manipulator.ObjectIdShufflerpymongo.son_manipulator.AutoReferencepymongo.son_manipulator.NamespaceInjectorpymongo.database.Database.add_son_manipulator()pymongo.database.Database.outgoing_copying_manipulatorspymongo.database.Database.outgoing_manipulatorspymongo.database.Database.incoming_copying_manipulators ,以及 pymongo.database.Database.incoming_manipulators

删除了 manipulate 参数来自 find()find_one() ,以及 Cursor()

这个 pymongo.son_manipulator.SONManipulator API作为一种转换数据的技术存在局限性,在PyMongo 3.0中已被弃用。相反,在将传出文档传递到PyMongo之前,在您自己的代码中转换传出文档,并在从PyMongo接收到传入文档之后转换传入文档,这会更加灵活和直接。

或者,如果您的应用程序使用 SONManipulator API将自定义类型转换为BSON,则 TypeCodecTypeRegistry API可能是一个合适的替代方案。有关更多信息,请参见 custom type example

SON().items() 现在又回来了 dict_items 对象。#

items() 现在返回一个 dict_items 对象而不是列表。

SON().iteritems() 已删除。#

SON.iteritems() 现在被移除了。如下所示的代码::

for k, v in son.iteritems():

现在可以替换为如下代码::

for k, v in son.items():

IsMaster已删除#

已删除 pymongo.ismaster.IsMaster 。使用 pymongo.hello.Hello 取而代之的是。

NotMasterError已删除#

已删除 NotMasterError 。使用 NotPrimaryError 取而代之的是。

证书错误已删除#

已删除 CertificateError 。从PyMongo 3.0开始,此错误在内部处理,不会在应用程序中出现。

已删除PYMOGO。GEOHAYSTACK#

已删除 pymongo.GEOHAYSTACK 。替换为“GeoHayStack”或创建一个2D索引,并使用$GeoNear或$GeoWiThin。请参阅https://dochub.mongodb.org/core/4.4-deprecate-geoHaystack.

UUIDLegacy已删除#

已删除 bson.binary.UUIDLegacy 。使用 bson.binary.Binary.from_uuid() 取而代之的是。代码如下::

uu = uuid.uuid4()
uuid_legacy = UUIDLegacy(uu)

可以更改为::

uu = uuid.uuid4()
uuid_legacy = Binary.from_uuid(uu, PYTHON_LEGACY)

默认JSON模式从传统模式更改为宽松模式#

将默认的JSON编码表示从遗留更改为松弛。的json_mode参数 bson.json_util.dumps 现在默认为 RELAXED_JSON_OPTIONS

GridFS更改#

DISABLE_MD5参数已删除#

删除了 disable_md5 选项 GridFSBucketGridFS 。GridFS不再生成校验和。需要文件摘要的应用程序应该在GridFS外部实现它,并将其与其他文件元数据一起存储。例如::

import hashlib
my_db = MongoClient().test
fs = GridFSBucket(my_db)
with fs.open_upload_stream("test_file") as grid_in:
    file_data = b'...'
    sha356 = hashlib.sha256(file_data).hexdigest()
    grid_in.write(file_data)
    grid_in.sha356 = sha356  # Set the custom 'sha356' field

请注意,对于大文件,可能需要以块为单位计算校验和,以避免一次加载整个文件所需的过多内存。

已删除无迁移路径的功能#

CURSOR_MANAGER支持已删除#

已删除 pymongo.cursor_manager.CursorManagerpymongo.cursor_manager ,以及 pymongo.mongo_client.MongoClient.set_cursor_manager()

MongoClient.CLOSE_CURSOR已删除#

已删除 pymongo.mongo_client.MongoClient.close_cursor()pymongo.mongo_client.MongoClient.kill_cursors() 。取而代之的是用以下命令关闭游标 pymongo.cursor.Cursor.close()pymongo.command_cursor.CommandCursor.close()

将删除Database.val、Database.system_js和SystemJS#

已删除 eval()system_jsSystemJS 。MongoDB 3.0中弃用了val命令,并在MongoDB 4.2中将其删除。MongoDB 4.2+不能替代val。

然而,在MongoDB<=4.0上,代码如下::

>>> result = database.eval('function (x) {return x;}', 3)

可以更改为::

>>> from bson.code import Code
>>> result = database.command('eval', Code('function (x) {return x;}'), args=[3]).get('retval')

将删除Database.Error、Database.last_Status、Database.Precision_Error和Database.Reset_Error_HISTORY#

已删除 pymongo.database.Database.error()pymongo.database.Database.last_status()pymongo.database.Database.previous_error() ,以及 pymongo.database.Database.reset_error_history() 。这些方法已经过时:所有MongoDB写操作都使用确认的写关注,并在默认情况下报告它们的错误。这些方法在PyMongo 2.8中已弃用。

Collection.PARALLEL_SCAN已删除#

已删除 parallel_scan() 。MongoDB 4.2删除了 parallelCollectionScan command 。这是无可替代的。

已删除pymongo。消息帮助器#

已删除 pymongo.message.delete()pymongo.message.get_more()pymongo.message.insert()pymongo.message.kill_cursors()pymongo.message.query() ,以及 pymongo.message.update()

名称是pymongo.drive_info.DriverInfo的必需参数#

name 现在是的必需参数 pymongo.driver_info.DriverInfo 班级。

DBRef BSON/JSON解码行为#

更改了的BSON和JSON解码行为 DBRef 中概述的行为匹配 DBRef specification 版本1.0。具体地说,PyMongo现在只将子文档解码为 DBRef 当且仅当,它包含两者 $ref$id 字段和 $ref$id ,以及 $db 字段的类型正确。否则,文档将照常返回。以前,任何包含 $ref 字段将被解码为 DBRef

默认情况下,对UUID进行编码会引发错误#

默认设置 uuid_representationCodecOptionsJSONOptions ,以及 MongoClient 已从 bson.binary.UuidRepresentation.PYTHON_LEGACYbson.binary.UuidRepresentation.UNSPECIFIED 。正在尝试对 uuid.UUID 实例设置为BSON或JSON,现在默认情况下会生成错误。如果您以前使用的是UUID,则需要设置 uuid_representationbson.binary.UuidRepresentation.PYTHON_LEGACY 以避免数据损坏。如果您没有UUID,则应设置 bson.binary.UuidRepresentation.STANDARD 。如果没有显式设置值,则在尝试对 uuid.UUID **

ValueError: cannot encode native uuid.UUID with UuidRepresentation.UNSPECIFIED. UUIDs can be manually converted...

看见 处理UUID数据 了解更多细节。

其他BSON类实现 __slots__#

Int64MinKeyMaxKeyTimestampRegex ,以及 DBRef 现在实施 __slots__ 以减少内存使用量。这意味着它们的属性是固定的,并且不能在运行时将新属性添加到对象。