mongoengine bulk upsert 一批记录?
mongoengine bulk upsert a batch of record?
我想upsert(update or insert) a list of record
,其实我知道mongodb从mongodb3.0开始支持bulk
操作。
我想知道mongoengine
是否支持mongoengine (0.10.0)
中的bulk upsert operation
。
如果没有,我想知道如何upsert
记录列表,我知道mongoengine
支持insert
像这样的批处理:
class User(Document):
username = StringField(required=True)
password = StringFiedl(required=True)
meta = {'db_alias': 'user_info', 'collection': 'user',
'indexes': [{'fields': ['username'], 'unique': True}]
}
def save_users(self, users):
Users.objects.insert(users) # raise mongoengine.errors.NotUniqueError
您实际上可以直接使用 bulk operations API,方法是从 MongoEngine 使用的 pymongo 驱动程序访问底层集合对象。 MongoDB本身从2.6版本开始支持批量操作。自 pymongo 驱动程序的 v3 以来,有更新的方法来访问这些,但是自相应的驱动程序更新到 2.6 服务器版本 (pymongo 2.7) 以来,基本方法已经存在。
要使用 MongoEngine 获得此功能,您可以将未记录的 ._get_collection()
从 class 调用到 return collection 对象:
bulk = Users._get_collection().initialize_ordered_bulk_op()
for user in users: # where users is a list of dicts containing data to work on
bulk.find({ "matchField": user['matchField'] }).upsert().replace_one(user)
bulk.execute()
或 bulk methods such as .update_one()
which you probably want. And .upsert()
的任何其他用法是修改此类更新语句的链接方法。
您在这里使用的是原始 python 对象,因为 MongoEngine 本身没有直接的等效项。但是您可以通过访问底层驱动程序的方法来使用这些操作
您可以使用 mongo.collection.Collection.bulk_write
:
operations = [
pymongo.ReplaceOne({'username': user. username}, user.to_mongo(), upsert=True)
for user in users
]
result = User._get_collection().bulk_write(operations)
我想upsert(update or insert) a list of record
,其实我知道mongodb从mongodb3.0开始支持bulk
操作。
我想知道mongoengine
是否支持mongoengine (0.10.0)
中的bulk upsert operation
。
如果没有,我想知道如何upsert
记录列表,我知道mongoengine
支持insert
像这样的批处理:
class User(Document):
username = StringField(required=True)
password = StringFiedl(required=True)
meta = {'db_alias': 'user_info', 'collection': 'user',
'indexes': [{'fields': ['username'], 'unique': True}]
}
def save_users(self, users):
Users.objects.insert(users) # raise mongoengine.errors.NotUniqueError
您实际上可以直接使用 bulk operations API,方法是从 MongoEngine 使用的 pymongo 驱动程序访问底层集合对象。 MongoDB本身从2.6版本开始支持批量操作。自 pymongo 驱动程序的 v3 以来,有更新的方法来访问这些,但是自相应的驱动程序更新到 2.6 服务器版本 (pymongo 2.7) 以来,基本方法已经存在。
要使用 MongoEngine 获得此功能,您可以将未记录的 ._get_collection()
从 class 调用到 return collection 对象:
bulk = Users._get_collection().initialize_ordered_bulk_op()
for user in users: # where users is a list of dicts containing data to work on
bulk.find({ "matchField": user['matchField'] }).upsert().replace_one(user)
bulk.execute()
或 bulk methods such as .update_one()
which you probably want. And .upsert()
的任何其他用法是修改此类更新语句的链接方法。
您在这里使用的是原始 python 对象,因为 MongoEngine 本身没有直接的等效项。但是您可以通过访问底层驱动程序的方法来使用这些操作
您可以使用 mongo.collection.Collection.bulk_write
:
operations = [
pymongo.ReplaceOne({'username': user. username}, user.to_mongo(), upsert=True)
for user in users
]
result = User._get_collection().bulk_write(operations)