【fastapi+mongodb】使用motor操作mongodb(三)

本篇文章介绍mongodb的删和改,下面是前两篇文章的链接:
【fastapi+mongodb】使用motor操作mongodb
【fastapi+mongodb】使用motor操作mongodb(二)

delete

delete 的用法基本和查找一致,包括delete_one(删除一个),delete_many(匹配到的全部删除),我们以delete_one为例:

python 复制代码
async def delete_user_by_name(name: str):
    delete_result = await collection_users.delete_one({'name':name})
    print(delete_result)
python 复制代码
loop.run_until_complete(delete_user_by_name('bluebonnet27'))

打印出来的result如下:

bash 复制代码
DeleteResult({'n': 1, 'ok': 1.0}, acknowledged=True

其实这个result看源代码就知道它的结构了:

python 复制代码
class DeleteResult(_WriteResult):
    """The return type for :meth:`~pymongo.collection.Collection.delete_one`
    and :meth:`~pymongo.collection.Collection.delete_many`
    """

    __slots__ = ("__raw_result",)

    def __init__(self, raw_result: Mapping[str, Any], acknowledged: bool) -> None:
        self.__raw_result = raw_result
        super().__init__(acknowledged)

    def __repr__(self) -> str:
        return f"{self.__class__.__name__}({self.__raw_result!r}, acknowledged={self.acknowledged})"

    @property
    def raw_result(self) -> Mapping[str, Any]:
        """The raw result document returned by the server."""
        return self.__raw_result

    @property
    def deleted_count(self) -> int:
        """The number of documents deleted."""
        self._raise_if_unacknowledged("deleted_count")
        return self.__raw_result.get("n", 0)

因此我们可以调用deleted_count方法返回被删除的数据个数,以及是否删除成功(delete方法本身是不会报异常的,没有满足要求的数据就什么都不执行)

update

更新主要是两类函数:replace和update,前者会用传入的对象整个覆盖掉document(就算你传入的是个空的document),后者可以选择修改哪些字段。

我们先以replace_one为例子:

python 复制代码
async def replace_user():
    document_user = await collection_users.find_one({'name':'bluebonnet28'})
    _id = document_user['_id']
    replace_result = await collection_users.replace_one({'_id': _id}, {'age': 30})
    print(replace_result.matched_count)
    print(replace_result.modified_count)

整个文档都会被替换,除了id,因此名字也没了,新的文档如下:

试试温和一点的update_one:

python 复制代码
async def update_name_of_user_by_age(age: int, name: str):
    update_result = await collection_users.update_one({'age': age}, {'$set': {'name': name}})
    print(update_result.matched_count)
    print(update_result.modified_count)
python 复制代码
loop.run_until_complete(update_name_of_user_by_age(30, 'name'))

我们将刚才的数据重新修改了下,现在它是这样的:

相关推荐
小码哥_常1 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
代码山河4 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
在世修行4 小时前
智学文枢:题目流水线
python·多线程·状态机·pyside
学长毕设4 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
梯度下降者5 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
“AI国潮设计-小江”6 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
努力的小雨7 小时前
给 AI 眼镜开发应用有多难?我从零做了一个陪练,还上架了
后端
benchmark_cc7 小时前
用 Python 拉 A 股全市场实时快照:Notebook 请求、结果校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash
伞伞悦读7 小时前
【第70期】Adam二阶矩不是方差:偏差校正、动量与AdamW完整实验
python
excel8 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端