如何在mongoengine中使用有序false进行批量插入

时间:2017-01-09 06:00:09

标签: python mongodb pymongo mongoengine

我试图批量插入文档,我在我的集​​合中创建了一个唯一索引,并希望在批量插入时跳过重复的文档。这可以使用原生mongodb函数来完成:

db.collection.insert(
    <document or array of documents>,
    {
        ordered: <boolean>
    }
)

我想用mongoengine完成此任务,如果有人知道如何实现这一点,请回答这个问题,谢谢。

2 个答案:

答案 0 :(得分:1)

如果您有这样的课程:

class Foo(db.Document):
    bar= db.StringField()    
    meta = {'indexes': [{'fields': ['bar'], 'unique': True}]}

拥有包含Foo个实例foos=[Foo('a'), Foo('a'), Foo('a')]的列表 并尝试Foo.objects.insert(foos)您将获得mongoengine.errors.NotUniqueError

第一个问题是从mongodb删除索引,插入重复项,然后确保使用{unique : true, dropDups : true}索引

第二种解决方法是使用基础pymongo API进行批量操作:https://docs.mongodb.com/manual/reference/method/db.collection.initializeOrderedBulkOp/#db.collection.initializeOrderedBulkOp

答案 1 :(得分:0)

目前,我正在使用mongoengine的原始pymongo作为解决方法。这是@Alexey Smirnov提到的第二种解决方法。因此,对于mongoengine Document类DocClass,您将访问基础的pymongo集合并执行如下查询:

from pymongo.errors import BulkWriteError


try:
    doc_list = [doc.to_mongo() for doc in me_doc_list] # Convert ME objects to what pymongo can understand
    DocClass._get_collection().insert_many(doc_list, ordered=False)

except BulkWriteError as bwe:
    print("Batch Inserted with some errors. May be some duplicates were found and are skipped.")
    print(f"Count is {DocClass.objects.count()}.")

except Exception as e:
    print( { 'error': str(e) })