8.3 GridFS常用操作
GridFS是一个分布式文件系统,支持文件的上传、下载、删除、更新等操作,可以通过MongoDB提供的驱动程序中的API来实现;也可通过mongofiles命令实现。 mongofiles命令行操作GridFS
1.上传大文件到集群GridFS中的mydocs数据库中
mongofiles –port 40009 –db mydocs –local D:/workspace/books.pdf put books.pdf
mongofiles –help 查看更多选项
–db mydocs将文档插入数据库;–local本地系统上的文件;put为上传文件;books.pdf为集合fs.files中的字段filename的值
2.通过mongo连接集群查看是否上传成功
use mydocs
db.fs.files.find() //即可查看到文档
sh.status() //可查看到mydocs
3.下载文件到本地
mongofiles –port 40009 –db mydocs –local D:/workspace/123.pdf get books.pdf
4.查询集群GridFS中的某个文件是否存在
mongofiles –port 40009 –db mydocs search books.pdf
5.删除集群GridFS中的某个文件
mongofiles –port 40009 –db mydocs delete books.pdf
- MongoDB驱动程序中的API实现:
小文件存储:文件小于16MB,用户可以上传自己的pdf,ppt,excel,对于这种需求,直接使用MongoDB的二进制存储功能。
下面以Python驱动实现小文件存储为例:
Python3.8,PyMongo 3.10.1,MongoDB 4.4
Python安装方法参考:
https://www.runoob.com/python3/python3-install.html
PyMongo安装方法参考:
https://www.runoob.com/python3/python-mongodb.html
小文件上传:
参考:https://blog.csdn.net/fandroid/article/details/104434326
#!/usr/bin/python3
from pymongo import MongoClient
# connecting to database. db:testfile, collection:hello
myclient = MongoClient('mongodb://localhost:40009/')
db = myclient.testfile
collection = db.hello
# open a file to upload
myfile = open(file='D:/workspace/language.pdf',mode='rb')
data = myfile.read()
doc = [{"userid":"5",
"filename":"language",
"filettype":"pdf",
"content":data,
"size":"3000"
}]
# insert document
result = collection.insert_many(doc)
print(result)
myfile.close()
- 上述代码执行成功后,查看数据库: mongos>db.hello.find({},{content:0})
从结果可知代码将PDF格式的文件上传到分布式集群中,content中以二进制形式保存了文件的全部内容。 {content:0}表示不返回此字段的值。
参考:
https://blog.csdn.net/fandroid/article/details/104434326
#!/usr/bin/python3
from pymongo import MongoClient
# connecting to database. db:testfile, collection:hello
myclient = MongoClient('mongodb://localhost:40009/')
db = myclient.testfile
collection = db.hello
# find a file to download with "content" value. Stored in test.pdf
mydoc = collection.find_one({"userid":"5"},{"_id":0,"content":1})
myfile = open(file='D:/workspace/test.pdf',mode='ab')
data = myfile.write(mydoc["content"])
myfile.close()
-
可以在D:/workspace/test.pdf中查看到下载的文件 。
上述例子说明,MongoDB可以直接作为一个存储小文件(小于16MB)的分布式文件系统,主要依赖三点:
MongoDB可以直接存储二进制数据
MongoDB可以部署成分片集群,实现海量数据存储、读写分离
集群中的片可以部署成复制集,保证数据的可靠性 -
MongoDB驱动程序中的API实现: 大文件存储:同样采用Python实现
参考: https://blog.csdn.net/fandroid/article/details/104434636 -
大文件上传到GridFS:
#!/usr/bin/python3
from pymongo import MongoClient
from gridfs import GridFS
# connecting to database. db:testfile
myclient = MongoClient('mongodb://localhost:40009/')
db = myclient.testfile
# Create a new instance of GridFS
gridfs_col = GridFS(db)
# open a file to upload
myfile = open(file='D:/workspace/books.pdf',mode='rb')
mydata = myfile.read()
# upload file to GridFS
myfile = gridfs_col.put(data=mydata,filename="books.pdf")
print(myfile)
通过db.fs.files.find()可以查看文件是否上传成功;
- 从GridFS下载大文件:
#!/usr/bin/python3
from pymongo import MongoClient
from gridfs import GridFS
# connecting to database. db:testfile
myclient = MongoClient('mongodb://localhost:40009/')
db = myclient.testfile
# Create a new instance of GridFS
gridfs_col = GridFS(db)
# find a file to download with "books.pdf" value. Stored in 111.pdf
mydata = gridfs_col.get_version("books.pdf").read()
myfile = open(file='D:/workspace/111.pdf',mode='wb')
rs = myfile.write(mydata)
print(rs)
- 结合大小文件的上传下载分析: 可以实现存储海量数据的分布式文件存储方案 对于用户上传的任何文件: 通过客户端判断,小文件直接存储在普通集合中; 通过客户端判断,大文件则上传到GridFS中; GridFS不适合小文件存储,因为从GridFS中读取数据涉及到两次查询操作,如图所示: