本篇文章介绍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'))
我们将刚才的数据重新修改了下,现在它是这样的: