【问题标题】:How to do bulk insert with ordered false in mongoengine如何在mongoengine中使用order false进行批量插入
【发布时间】:2017-05-23 08:22:41
【问题描述】:

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

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

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

【问题讨论】:

标签: python mongodb pymongo mongoengine


【解决方案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

【讨论】:

    【解决方案2】:

    现在我正在使用来自 mongoengine 的原始 pymongo 作为解决方法。这是@Alexey Smirnov 提到的第二个解决方法。因此,对于 mongoengine 文档类 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) })
    

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 1970-01-01
      • 2012-02-12
      • 2016-10-09
      • 1970-01-01
      • 2011-07-28
      • 2018-11-19
      • 2017-07-17
      相关资源
      最近更新 更多