mongoengine 批量更新插入一批记录?

rog*_*ger 2 python upsert mongodb mongoengine

我想upsert(update or insert) a list of record,其实我知道mongodbbulk从mongodb3.0开始就支持操作了。

我想知道是否mongoengine支持bulk upsert operationmongoengine (0.10.0)

如果没有,我想知道如何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
Run Code Online (Sandbox Code Playgroud)

Bla*_*ven 6

您实际上可以使用批量操作 API通过从 MongoEngine 使用的 pymongo 驱动程序访问底层集合对象来直接。MongoDB 本身从 2.6 版开始支持批量操作。自 pymongo 驱动程序的 v3 版本以来,有更新的方法可以访问这些方法,但自相应的驱动程序更新到 2.6 服务器版本 ( pymongo 2.7 ) 以来,基本方法已经存在。

要使用 MongoEngine 获得此功能,您可以._get_collection()从类中调用 undocumented以返回集合对象:

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()
Run Code Online (Sandbox Code Playgroud)

或者批量方法的任何其他用法,例如.update_one()您可能想要的。和.upsert()是修改此类更新语句的链式方法。

您在这里使用原始 python 对象,因为 MongoEngine 本身没有直接的等价物。但是您可以通过访问底层驱动程序的方法来使用这些操作