e.g.
db.log.insert({filename:‘test.mp4’,size:247.8,path:"/home/tarena/mongodb/test.mp4"})
优点 : 节省数据库空间
操作简单快捷
缺点 : 当数据库或者文件位置发生变化时需要修改数据库内容
存储文件本身
将文件以二进制的形式存储到数据库中
优点 : 数据库在文件就在,不会受到迁移等影响
缺点 : 占用数据库空间大
存取效率低
GridFS存储大文件
大文件 : 在mongodb中认为 >16M 的文件为大文件
GridFS 方法
在mongodb中以两个集合配合的方法存储文件
fs.files : 存储文件相关信息(文件名,文件类型)
fs.chunks :分块存储文件实际内容
存储文件:
mongofiles -d dbname put file
dbname : 要将文件存入的数据库,如果不存在自动创建
file : 要保存的文件
e.g. 将test.mp4存入grid数据库
mongofiles -d grid put test.mp4
fs.files结构
{ “_id” : ObjectId(“5ba452a869d72e12d5cd4e46”), “chunkSize” : 261120, “uploadDate” : ISODate(“2018-09-21T02:09:04.193Z”), “length” : 247759369, “md5” : “a94853f4f64b3e87bf98aea770855615”, “filename” : “test.mp4” }
fs.chunks结构
{ “_id” : ObjectId(“5ba452a869d72e12d5cd4e59”), “files_id” : ObjectId(“5ba452a869d72e12d5cd4e46”), “n” : 18, “data” : BinData(0,“G2…qRv”) }
提取文件:
mongofiles -d dbname get file
e.g.
mongofiles -d grid get test.mp4
优缺点
优点 : 操作方便,提供较好的存储命令,使用数据库存储文件方便移植
缺点 : 读写效率低
# 将文件以grid方法存入到到mongodb数据库中
from pymongo import MongoClient
import gridfs
conn = MongoClient('localhost',27017)
db = conn.grid
#获取gridfs对象
fs = gridfs.GridFS(db)
#打开mm.jpg文件 存入数据库的内容必须为bytes格式 所以r形式打开
f = open('mm.jpg','rb')
#将内容写入到数据库
fs.put(f.read(),filename = 'mm.jpg')
conn.close()
# 获取grid方案存放到数据库中的文件
from pymongo import MongoClient
import gridfs
conn = MongoClient('localhost',27017)
db = conn.grid
#获取gridfs对象 grid数据库中
fs = gridfs.GridFS(db)
#得到文件集合对象
files = fs.find()
#分别取每一个文件 两个集合 一个存放信息 一个存放实际的内容
for file in files:
#打印每个文件名称
print(file.filename)
if file.filename == "mm.jpg":
with open(file.filename,'wb') as f:
#从数据库读取内容
data = file.read()
#写入到本地
f.write(data)
conn.close()