当前位置:   article > 正文

MongoDB 的大文件存储和游标_mongodb怎么保存大于16m的文件

mongodb怎么保存大于16m的文件
  • GridFS:MongoDB当中存储大文件的一种方案,MongoDB中认为超过16M的文件为大文件
  • 将文件以二进制数据的方式存储在数据库中,通过两个集合共同完成该文件的存储
  • fs.files:存储文件的相关信息,如文件名filename,文件类型content_type等
  • fs.chunks:实际存储文件内容,以二进制方式分块存储,将大文件分成多个小块,每个小块占一条文档
  • 优点:文件和数据库绑定
  • 缺点:当存储文件大时,空间使用大,提取较慢
1、存储大文件
  • 在命令行中输入 mongofiles -d dbname put file_path
  • dbname:数据库名称,如果存在dbname则直接存储文件,如不存在,则自动创建dbname数据库,再存储文件
  • file_path:需要存储文件的路径
    在这里插入图片描述
2、查看文件
  • 查看文件信息:db.fs.files.find()
    在这里插入图片描述
use grid
db.fs.files.find()

{
	"_id" : ObjectId("5cbd1aab2ee99b20d42fb744"),
	"chunkSize" : NumberInt(261120),
	"uploadDate" : ISODate("2019-04-22T09:36:49.556+08:00"),  // 存储时间
	"length" : NumberInt(91222751),   // 文件大小
	"md5" : "54ca1997408bbae6814ffe0bb501006a",
	"filename" : "C:\\Users\\Administrator\\Desktop\\aaa.pptx"  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 查看文件内容:db.fs.chunks.find()
db.fs.chunks.find()

{
	"_id" : ObjectId("5cbd1aab2ee99b20d42fb745"),   
	"files_id" : ObjectId("5cbd1aab2ee99b20d42fb744"),  // fs.files中对应文件的_id
	"n" : NumberInt(0),   // 块数
	"data" : BinData(0,"UEsDBAoAAAAAA...  more 261096 bytes")  // 二进制块,每个块大约32KB
},
{
	"_id" : ObjectId("5cbd1aab2ee99b20d42fb746"),   
	"files_id" : ObjectId("5cbd1aab2ee99b20d42fb744"),  
	"n" : NumberInt(1),   
	"data" : BinData(0,"hHrztljLZnS3k...  more 261096 bytes ")  
},
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
3、用pymongo获取文件
import pymongo
import gridfs

coon = pymongo.MongoClient("127.0.0.1", 27017)  # 创建数据库连接
db = coon.grid  # 切换到大文件数据库

fs = gridfs.GridFS(db)  # 获取gridFS对象

files = fs.find()  # 可迭代对象,每个对象为一个文件
for file in files:
    with open(file.filename, "wb") as f:  # file.filename为原文件的存储路径
        while True:   # 循环读写操作
            data = file.read(64)  
            if not data:
                break
            f.write(data)
coon.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
4、游标
  • 使用游标的目的:
    • 防止网络拥塞,造成数据传输慢
    • 避免用户解析带来的 体验差,可以进行后端解析
  • 创建游标:var cursor = db.collectionName.method()
  • 使用游标:cursor.next()
var cursor = db.student.find();  // 创建游标
cursor.next()    // 使用游标
{
        "_id" : ObjectId("5cb95eb8da176022385c1a84"),
        "stu_name" : "陈飞扬",
        "stu_ID" : "2019023105",
        "stu_age" : 18,
        "stu_hobby" : [
                "篮球",
                "足球",
                "吉他"
        ],
        "msg" : "aeqwe 喜欢"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这里插入图片描述

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号