文件存储在mongodb数据库中

文件存储:

  1. 存储文件路径

e.g.
db.log.insert({filename:‘test.mp4’,size:247.8,path:"/home/tarena/mongodb/test.mp4"})

优点 : 节省数据库空间
操作简单快捷
缺点 : 当数据库或者文件位置发生变化时需要修改数据库内容

  1. 存储文件本身
    将文件以二进制的形式存储到数据库中

    优点 : 数据库在文件就在,不会受到迁移等影响

    缺点 : 占用数据库空间大
    存取效率低

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数据库中:

代码:

# 将文件以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()

读取mongodb数据库中的文件:

代码:

# 获取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()

你可能感兴趣的:(数据库)