MongoDB与Python的交互
一、安装pymongo模块
1.创建连接: MongoClient是MongoDB的客户端代理对象,可以用来执行增删改查操作,而且还内置了连接池。
from pymongo import MongoClient
client= MongoClient(host="localhost",port=27017)
client.admin.authenticate("admin","abc123456")
二、学习pymongo的CRUD
查询数据、添加数据、修改数据、删除数据
1.数据写入:insert_one和insert_many两个函数可以向MongoDB写入数据
from test1 import client
# 插入单条数据
client.school.teachers.insert_one({"name":"李璐2","role":"兼职老师"})
#插入多条数据
client.school.teacher.insert_many([{"name":"晨刚"},{"name":"郭丽丽"}])
2.数据查询:find one和find两个函数可以从MongoDB中查询数据
from test1 import client
try:
teachers = client.school.teacher.find({})
for one in teachers:
print("查找多条数据:",one["_id"],one["name"])
teacher = client.school.teacher.find_one({"name":"李璐"})
print("查找单条数据:",teacher["_id"],teacher["name"])
except Exception as e:
print(e)
3.修改数据:update_one和update_many两个函数可以修改MongoDB数据
from test1 import client
#修改多条数据
client.school.teacher.update_many(
{},{"$set":{"role":["班主任"]}}
)
#修改单条数据
client.school.teacher.update_one({"name":"李璐"},{"$set":{"sex":"女"}})
client.school.teacher.update_one({"name":"李璐"},{"$push":{"role":"年级主任"}})
4.删除数据:delete_one和delete_many两个函数可以修改MongoDB数据
from test1 import client
try:
#删除单条数据
# client.school.teacher.delete_one({"name":"晨刚"})
#删除多条数据
client.school.teachers.delete_many({})
except Exception as e:
print(e)
函数 | 功能 |
---|---|
skip | 用于数据分页查询 |
limit | 用于数据分页查询 |
count | 查询记录总数 |
distinct | 查询不重复的字段值 |
sort | 对记录排序 |
from test1 import client
#查询数据分页选取前十条
teachers = client.school.teacher.find({}).skip(0).limit(10)
for one in teachers:
print(one["_id"],one["name"])
#查询不重复的姓名
teachers =client.school.teacher.distinct("name")
for one in teachers:
print(one)
#查询结果按名字降序排序sort([()])
teachers =client.school.teacher.find().sort([("name",-1)])
for one in teachers:
print(one["_id"],one["name"])
三、学习GrideFS引擎
GrideFS存储引擎机制,文件的保存、查询、提取和删除
MongoDB的文件存储
搭建一套程序系统,其中一项重要的功能就是文件存储,看似简单,似乎又不太好实现。
在Web3.0时代数据的形式不局限与文字,还有语音、视频、图片等。
微信的语音留言等等也是可以存储在mongodb里面的,然后标记上属性:是谁发出的、接收人是谁、发出时间是什么时候,当接收人上线之后,从微信服务器上面提取这些消息就可以了。还有抖音里面保存的各种短视频、qq相册里面保存的照片也可以保存在mongodb 里面。
在mongodb上面文件保存的几种方式:
- 把文件直接保存到硬盘上:这种方式最简单,但是并不适用于分布式部署环境; NAS可以存放大量的文件,也能对应发布环境,但是文件的管理显得不方便;
最简单的文件保存方式就是将文件保存在硬盘上面,这种方式最明显的就是文件管理起来不方便,如果用户在一个文件夹中存储了几百万张照片,想要提取文件里面是在上海东方明珠拍摄的照片根本没办法提取;后来有人想出了一个办法就是将拍摄出来的照片信息保存到mysql数据库里面,然后设置字段存放文件在硬盘上面的存储路径,如果想找上海东方明珠的照片,就在mysql里面找这张照片的信息然后找到他的存放路劲再到硬盘上面去找到这张照片,但是当你想要删除硬盘中的照片或者是mysql中的记录时,这个地方的数据没办法一起操作,往往会造成硬盘中的照片删除了,但是mysql中的记录没有删除等,因此管理起来也不是那么方便。
当用户在客户端上传了一张图片后,NGINX在做负载均衡的时候把网络请求分给第一个服务器,然后图片就存放在第一个服务器的硬盘上面了,后来用户想要刷新客户端想看图片查看是否上传成功时,这时候的网络请求被NGINX分发给了第二个服务器,而在第二个服务器的硬盘上面是没有第一次上传的这张图片的;所以分布式存储不适合将文件存储在本地硬盘上面。
- 把文件存储在文件服务器上
NAS可以存放大量的文件,也能应对分布式环境,但是队文件的管理显得不方便
- 把普通的SQL数据库,不适合存储文件,但是MongoDB却额外提供了文件存储
GridFS存储引擎
GridFS是MongoDB的文件存储方案,主要用于存储超过16M(BSON文件限制)的文件(如:图片、音频等),对大文件有着更好的性能
GridFS存储原理
- GridFS使用两个集合来存储文件,一个是chunks集合,用来存放文件(的内容);另一个集合是files,用于存储文件的元数据(文件的名字\体积\上传信息\自己定义文件的属性信息等)。
- GridFS会把文件分割成若干chunks(256KB),然后在files记录它们
连接GridFS
- 默认情况下MongoClient不提供操作GridFS,需要创建GridFS对象
- put函数可以把文件存储到GridFS中
from test1 import client
from gridfs import GridFS
db = client.school
gfs = GridFS(db,collection="book")
file = open("D:/GRFS的测试文件呀.pdf","rb")
args = {"type":"PDF","keyword":"linux"}
gfs.put(file,filename="GRFS的测试文件呀.pdf",**args)
file.close()
查询文件
- find和find one函数可以查询GridFS中存储的文件
db = client.school
gfs = GridFS(db,collection="book")
book = gfs.find_one({"filename":"GRFS的测试文件呀.pdf"})
print(book.filename)
print(book.type)
print(book.keyword)
print("%dM"%math.ceil(book.length/1024/1024))
books = gfs.find({"type":"PDF"})
for one in books:
uploadDate = one.uploadDate + datetime.timedelta(hours=8)
# uploadDate = uploadDate.strftime("%Y-%m%-%d %H:%M:%S")
# print(one._id,one.filename,uploadDate)
print(uploadDate)
判断文件是否存在
db = client.school
gfs = GridFS(db,collection="book")
rs = gfs.exists(ObjectId("619dfa84ffaccd534b52346f"))
print(rs)
rs = gfs.exists(**{"filename":"GRFS的测试文件呀.pdf"})
print(rs)
读取文件
get函数可以从GridFS中读取文件,并且只能通过主键查找文件(每次只能读取一个文件)
db =client.school
gfs = GridFS(db,collection="book")
document=gfs.get(ObjectId("619dfa84ffaccd534b52346f"))
file = open("D:/Linux手册.pdf","wb")
file.write(document.read())
file.close()
删除文件
delete函数可以从GridFS中删除文件,并且只能通过主键先查找记录
db = client.school
gfs = GridFS(db,collection="book")
gfs.delete(ObjectId("619dfa84ffaccd534b52346f"))