混合存储策略:将超大JSON嵌入文档与GridFS分桶自动转换
基于文档大小阈值自动路由:小数据存内嵌数组,大数据存GridFS并保留引用指针 · 难度:入门 · +10XP
混合存储策略:将超大JSON嵌入文档与GridFS分桶自动转换
BSON 文档有16MB限制,很多教程只建议用GridFS。本教程提出一种自适应策略:写操作前通过预聚合估算文档大小,若超过阈值则自动将部分字段提取到GridFS,原文档保留 fs_id 引用。读取时通过聚合管道的 $lookup + $unionWith 透明重组。这样既享受内嵌数组的读取性能,又突破大小限制,适合发票附件或日志正文等场景。
const MAX_BSON = 10 * 1024 * 1024; // 10MB
async function smartInsert(order) {
const size = Object.bsonsize(order);
if (size < MAX_BSON) {
return db.orders.insertOne(order);
}
const bucket = new GridFSBucket(db, { bucketName: 'big_fields' });
const uploadStream = bucket.openUploadStream(order._id.toString());
uploadStream.write(JSON.stringify(order.attachments));
uploadStream.end();
delete order.attachments;
order.gridFsId = uploadStream.id;
return db.orders.insertOne(order);
}