如何在mongoengine中使用ordered false进行批量插入
How to do bulk insert with ordered false in mongoengine
我正在尝试批量插入文档,我在我的集合中创建了一个唯一索引,并希望在批量插入时跳过重复的文档。这可以通过原生 mongodb
函数来完成:
db.collection.insert(
<document or array of documents>,
{
ordered: <boolean>
}
)
我想用mongoengine
完成这个,如果有人知道如何实现,请回答问题,谢谢。
如果你有这样的class:
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
现在我使用来自 mongoengine 的原始 pymongo 作为解决方法。这是@Alexey Smirnov 提到的第二种解决方法。因此,对于 mongoengine Document class 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) })
我正在尝试批量插入文档,我在我的集合中创建了一个唯一索引,并希望在批量插入时跳过重复的文档。这可以通过原生 mongodb
函数来完成:
db.collection.insert(
<document or array of documents>,
{
ordered: <boolean>
}
)
我想用mongoengine
完成这个,如果有人知道如何实现,请回答问题,谢谢。
如果你有这样的class:
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
现在我使用来自 mongoengine 的原始 pymongo 作为解决方法。这是@Alexey Smirnov 提到的第二种解决方法。因此,对于 mongoengine Document class 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) })