在MongoDB中访问文件通常涉及两种主要方式:使用GridFS存储大文件,或直接在文档中嵌入小文件(Base64编码)。以下是详细说明:
chunks
(默认255KB),并存储在两个集合:fs.files
:存储文件元数据(文件名、大小、MD5等)fs.chunks
:存储二进制数据块| 方式 | 优势 | 劣势 | |----------------|---------------------------------------------|----------------------------------| | GridFS | 支持大文件、断点续传、流式读写、MD5校验 | 查询复杂度略高,需拼接chunks | | 嵌入式文件 | 简单易用,无需额外查询 | 仅适合小文件,增大文档体积 |
const { MongoClient, GridFSBucket } = require('mongodb');
const fs = require('fs');
async function handleFile() {
const client = new MongoClient('mongodb://localhost:27017');
await client.connect();
const db = client.db('test');
const bucket = new GridFSBucket(db);
// 上传文件
const uploadStream = bucket.openUploadStream('example.mp4');
fs.createReadStream('./example.mp4').pipe(uploadStream);
// 下载文件
const downloadStream = bucket.openDownloadStreamByName('example.mp4');
downloadStream.pipe(fs.createWriteStream('./downloaded.mp4'));
}
handleFile();
from pymongo import MongoClient
import base64
client = MongoClient('mongodb://localhost:27017')
db = client.test
# 嵌入Base64文件
with open('icon.png', 'rb') as f:
encoded = base64.b64encode(f.read()).decode('utf-8')
db.users.insert_one({"username": "Alice", "avatar": encoded})
# 读取文件
user = db.users.find_one({"username": "Alice"})
with open('avatar_out.png', 'wb') as f:
f.write(base64.b64decode(user['avatar']))
filename
或metadata
字段建索引。contentType
元数据字段加速分类检索(如image/png
)。通过上述方法,可高效安全地在MongoDB中管理文件。
没有搜到相关的文章