pymongo 插数据

2020-12-08  本文已影响0人  kakarotto

批量插入

insert_one

这种方法在数据量较小时可以很好的工作,但是当数据量非常大时,此种操作会非常慢,我们需要通过批量写入的方式来写入数据。

insert_many

参数:

批量更新

前面的例子在插入操作时非常有效,但是对于更新操作由于update_many无法针对每一个doc进行更新,如本例中针对每一个uid进行更新,那么就需要使用bulk_write操作。

from pymongo import UpdateOne

update_operations = []
for uid, user_data in user_dict.items():
    op = UpdateOne({'uid': uid}, {'$set': {'user_data': user_data}}, upsert=True)
    update_operations.append(op)

user_collection.bulk_write(update_operations, ordered=False, bypass_document_validation=True)

批量读取

批量读取我们可以使用$in操作符,但是需要注意的是如果$in针对的list 过大,那么可能会导致报错pymongo.errors.DocumentTooLarge, 目前我的做法是将大的 list 分割成1000个一段,然后分段查询

list_length = len(uid_list)
iter_size = 1000
current = 0
while current < list_length:
    end = current + iter_size
    uid_segment = uid_list[current: end]
    result_cursor = mongo_collection.find({"uid": {"$in": uid_segment}})
    for user_info in result_cursor:
        # do something
        ...
    current = current + iter_size
异常处理

在实践过程中,会遇到异常的情况,尤其是写入的时候,可能由于各种原因导致写入失败,因此需要catch exception,并打印详细信息,如下:

try:
    user_collection.insert_many(
        data_iter, ordered=False, bypass_document_validation=True)
except BulkWriteError as e:
    log.error(e.details)

原文: https://geekpy.github.io/2018/04/20/MongoDB%E5%A4%A7%E6%89%B9%E9%87%8F%E8%AF%BB%E5%86%99%E6%95%B0%E6%8D%AE%E4%BC%98%E5%8C%96%E8%AE%B0%E5%BD%95/

上一篇 下一篇

猜你喜欢

热点阅读