pymongo批量插入操作

向数据库新增大量数据是经常性的需求, pymongo 支持 insert_many. 然而主键是我们自定义的, 并非默认"_id", 这样批量插入, 并且实现更新记录的目的就有点困难.

insert_many用法

1
insert_many(documents, ordered=True, bypass_document_validation=False)

这个方法只能用来插入集合中不存在的记录, 并不会对已有的数据进行更新, 如果插入重复数据, 便会报错

搜索一番后发现万能的sf早有解决方法, 使用Bulk Operations API

Is there a way to skip over existing _id's for insert_many in Pymongo 3.0?

具体解决方法如下:

源答案并不能在主键存在的情况下对数据进行更新

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
def insert_many(collection, docs=None, update=True):
    if not docs:
        return
    # $set 的时候, 会更新数据, setOnInsert只插入不更新
    update_key = "$set" if update else "$setOnInsert"
    bulk = pymongo.bulk.BulkOperationBuilder(collection, ordered=False)
    for i in docs:
        if i.get(index_name):
            bulk.find({index_name: i[index_name]}).upsert().update_one({update_key: i})
        else:
            bulk.insert(i)
    result = bulk.execute()
    return result
	modify_count = result.get("nModified")  # 更新条目数
    insert_count = result.get("nUpserted") + result.get("nInserted")  # 总插入条数

另有一方法是pymongo.collection.Collection.bulk_write

加载评论