【问题标题】:Quickly add field to large MongoDB collection by _id通过 _id 快速将字段添加到大型 MongoDB 集合
【发布时间】:2021-05-24 21:38:38
【问题描述】:

我有一个 MongoDB 集合,例如:

[{'_id': abc, 'Sex': 'f'}, {'_id': bcd, 'Sex': 'm'}, {'_id': cde, 'Sex': 'm'}, {'_id': def, 'Sex': 'm'}]

我还有一个 Python 字典列表,例如:

[{'_id': abc, 'Age': 70}, {'_id': bcd, 'Age': 51}, {'_id': cde}, {'_id': def, 'Age': 'unknown'}]

我需要通过_id 匹配一个大型集合,更新每个文档,例如,如下:

[{'_id': abc, 'Sex': 'f', 'Age': 70}, {'_id': bcd, 'Sex': 'm', 'Age': 51}, {'_id': cde, 'Sex': 'm'}, {'_id': def, 'Sex': 'm', 'Age': 'unknown'}]

有没有办法有效地为大型收藏品做到这一点? (不仅仅是遍历字典列表并在每个文档上使用update_one。)

【问题讨论】:

    标签: python mongodb aggregation-framework pymongo


    【解决方案1】:

    有没有一种方法可以有效地处理大型集合?

    您可以执行Bulk Write Operations,而不是为每个文档发送单个更新操作。

    如果您使用的是PyMongo,那么它将根据 MongoDB 接受的最大消息大小自动将批量更新操作拆分为更小的子批次。

    例如,您可以遍历字典以构建 UpdateOne 写入对象,并构建一个包含 10000 次更新的 Unordered Bulk Write Operations

     requests = [
         UpdateOne({'_id': 'abc'}, {'$set': {'Age': 70}}),
         UpdateOne({'_id': 'bcd'}, {'$set': {'Age': 51}}),
     ]
     try:
         db.test.bulk_write(requests, ordered=False)
     except BulkWriteError as bwe:
         pprint(bwe.details)
    

    请注意,无序的批量写入操作会被批处理并以任意顺序发送到服务器,在那里它们可以并行执行。在尝试所有操作后报告发生的任何错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 2020-11-12
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 2021-12-22
      相关资源
      最近更新 更多