Bunnet/Beanie odm: 使用 upsert 替换 replace_one

0 投票
1 回答
40 浏览
提问于 2025-04-14 16:12

在 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传递给下面的部分:

https://github.com/roman-right/beanie/blob/e2d95be0843375353d6ec79a230f63d4f874ee0e/beanie/odm/queries/find.py#L980
        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(拉取请求),而不是和它对着干。

撰写回答