Bunnet/Beanie odm: 使用 upsert 替换 replace_one
在 bunnet/beanie 这个对象文档映射(odm)库中,.replace_one({"key": key}, doc, upsert=True)
的等价操作是什么呢?
1 个回答
1
这个ODM(对象文档映射)并没有提供这个功能。
它在后台使用了一个叫做motor的东西,只是把过滤器、文档和会话传递给下面的部分:
https://github.com/roman-right/beanie/blob/e2d95be0843375353d6ec79a230f63d4f874ee0e/beanie/odm/queries/find.py#L948 result: UpdateResult = (
self.document_model.get_motor_collection().replace_one(
self.get_filter_query(),
get_dict(
document,
to_db=True,
exclude={"_id"},
keep_nulls=document.get_settings().keep_nulls,
),
session=self.session,
)
)
你可以尝试把它放在一个批量写入的操作中。当把bulk_writer
参数传给update_one
时,它似乎会把任意参数pymongo_kwargs
传递给下面的部分:
bulk_writer.add_operation(
Operation(
operation=ReplaceOne,
first_query=self.get_filter_query(),
second_query=get_dict(
document,
to_db=True,
exclude={"_id"},
keep_nulls=document.get_settings().keep_nulls,
),
object_class=self.document_model,
pymongo_kwargs=self.pymongo_kwargs,
)
)
不过如果我想用这个库,我宁愿向维护者提出一个问题或者提交一个PR(拉取请求),而不是和它对着干。