ISEE小语
做人要谦虚,多听听别人的意见,然后记录下来,看看是谁对你有意见。
MongoDB是一个基于文档存储的NoSQL数据库,由MongoDB Inc.维护和支持。与传统的关系型数据库相比,MongoDB提供了高性能、高可用性和易扩展性的特点。
通过Python操作MongoDB也是比较常见的操作,本次分享Python对MongoDB数据库的增、删、改、查的基本操作。并做独立的封装,方便日常的调用。
环境:
IDE | Pycharm |
Python | 3.9.16 |
三方库 | pymongo==4.6.1 |
导入:
from pymongo import MongoClient
一、连接到数据库
创建新数据库my_database,并创建一个users集合。
MongoDB中的数据库实际上是在第一次向其写入文档时创建的。即,如果数据库my_database不存在,那么在下面增加文档的时候自动创建。
# 连接到MongoDB
@property
def connect(self):
client = MongoClient('mongodb://localhost:27017/')
db = client['my_database']
collection = db['users']
return client, collection
(左右滑动查看完整代码)
二、关闭连接
关闭连接
# 关闭连接
def connect_close(client):
client.close()
(左右滑动查看完整代码)
注:在大多数情况下,这不是必需的,因为Python脚本运行完毕,MongoDB客户端实例会在脚本结束时自动关闭连接。但为了在脚本运行过程中显式关闭数据库连接,这里可以在每次执行的时候进行关闭。
三、插入【insert】
为了方便,我们将插入分为单文档插入和批量插入
# 单文档插入
def insert_one(self, data: dict):
client, collection = self.connect
try:
result = collection.insert_one(data)
return result.inserted_id
except DuplicateKeyError as e:
return None
finally:
self.connect_close(client)
# 批量插入
def insert_many(self, data: list):
client, collection = self.connect
try:
result = collection.insert_many(data)
return result.inserted_ids
except DuplicateKeyError as e:
return None
finally:
self.connect_close(client)
(左右滑动查看完整代码)
调用执行:
# 单文档插入
user = {"name": "John", "age": 19, "sex": "man", "is_login": True}
result = mongo.insert_one(user)
print(result)
# 批量插入
users = [
{"name": "Tom", "age": 21, "sex": "man", "is_login": False},
{"name": "Sandy", "age": 18, "sex": "woman", "is_login": True},
{"name": "Lily", "age": 23, "sex": "woman", "is_login": True}
]
result = mongo.insert_many(users)
print(result)
(左右滑动查看完整代码)
结果:
四、更新【update】
为了方便,我们将更新分为单文档更新和批量更新
# 单文档更新
def update_one(self, conditions: dict, set_value: dict):
client, collection = self.connect
try:
result = collection.update_one(
conditions,
{"$set": set_value}
)
return result.matched_count
except DuplicateKeyError as e:
return None
finally:
self.connect_close(client)
# 批量更新
def update_many(self, conditions: dict, set_value: dict):
client, collection = self.connect
try:
result = collection.update_many(
conditions,
{"$set": set_value}
)
return result.matched_count
except DuplicateKeyError as e:
return None
finally:
self.connect_close(client)
(左右滑动查看完整代码)
调用执行:
# 单文档更新
condition = {"name": "John"}
set_value = {"age": 27, "is_login": False}
result = mongo.update_one(condition, set_value)
print(f"成功更新 {result} 位用户!")
# 批量文档更新
condition = {"sex": "woman"}
set_value = {"age": 20, "is_login": False}
result = mongo.update_many(condition, set_value)
print(f"成功更新 {result} 位用户!")
(左右滑动查看完整代码)
结果:
五、查询【find】
为了方便,我们将分为单文档查询、多文档查询
# 查询单文档
def find_one(self, conditions: dict):
client, collection = self.connect
result = collection.find_one(conditions)
return result
# 查询多文档
def find(self, conditions: dict):
client, collection = self.connect
result = collection.find(conditions)
return result
(左右滑动查看完整代码)
调用执行:
1. 查询单文档
查询name为John的数据,如果多个名叫John的人,也只会显示第一条数据
# 查询单文档
result = mongo.find_one({"name": "John"})
print(result)
(左右滑动查看完整代码)
结果:
2. 查询多文档
查询性别sex为man的数据,只以符合条件,就会查出所有
# 查询多文档
result = mongo.find({"sex": "man"})
for r in result:
print(r)
(左右滑动查看完整代码)
结果:
3. 查询多文档,并排序
查询性别sex为man的数据,只以符合条件,就会查出所有,并且根据age排序
# 查询排序
result = mongo.find({"sex": "man"})
for r in result.sort('age'):
print(r)
(左右滑动查看完整代码)
结果:
4. 查询多文档,并取第一条
查询性别sex为man的数据,只以符合条件,就会查出所有,并且取第一条
# 查询第一条
result = mongo.find({"sex": "man"})
for r in result.limit(1):
print(r)
(左右滑动查看完整代码)
结果:
5. 查询多文档,排序后并取第一条
查询性别sex为man的数据,只以符合条件,就会查出所有,并且根据age排序后取第一条
# 组合使用,查询排序后取第一条
result = mongo.find({"sex": "man"})
for r in result.sort('age').limit(1):
print(r)
(左右滑动查看完整代码)
结果:
六、删除【delete】
为了方便,我们将分为单文档删除 和 批量删除
# 单文档删除
def delete_one(self, conditions):
client, collection = self.connect
result = collection.delete_one(conditions)
self.connect_close(client)
return result.deleted_count
# 批量文档删除
def delete_many(self, conditions):
client, collection = self.connect
result = collection.delete_many(conditions)
self.connect_close(client)
return result.deleted_count
(左右滑动查看完整代码)
调用执行:
1. 删除姓名name为John的用户
# 删除单文档
result = mongo.delete_one({"name": "John"})
print(f"成功删除 {result} 位用户!")
(左右滑动查看完整代码)
结果:
2. 删除年龄age为20的用户
# 删除多文档
result = mongo.delete_many({"age": 20})
print(f"成功删除 {result} 位用户!")
(左右滑动查看完整代码)
结果:
七、总结
以上查、删、改的条件conditions,就像是Mysql中Sql语句的where条件,可以根据实际情况自定义。
注意每个方法中参数的格式,除了批量插入insert_many的data传入是list形式,其他的都是字典。
小栈整体封装了一下,方便使用:
有需求的朋友可自取哟
获取:后台回复"MongoDB"即可!
文章就分享到这儿,喜欢就点个赞吧!