MongoDB中单对象大小超16M的存储方案

 更新时间:2025年01月26日 10:09:37   作者:yuanpan  
在 MongoDB 中,单个文档的大小限制为 16MB,如果某个对象(文档)的大小超过 16MB该怎么办,所以本文给大家介绍了MongoDB中单对象大小超16M的存储方案,需要的朋友可以参考下

在 MongoDB 中,单个文档的大小限制为 16MB。如果某个对象(文档)的大小超过 16MB,可以通过以下几种方案解决:

1. 使用 GridFS

适用场景:需要存储大文件(如图像、视频、文档等)。

原理

  • MongoDB 的 GridFS 是一种专门用于存储超过 16MB 文件的工具。
  • 它会将大文件分割成多个 chunk(默认大小 255KB),并存储在两个集合中:
    • fs.files:存储文件的元数据(如文件名、大小、类型等)。
    • fs.chunks:存储文件的内容分块。

实现步骤

存储大文件 使用 MongoDB 驱动的 GridFS 工具存储文件。

Python 示例

from pymongo import MongoClient
from gridfs import GridFS
 
client = MongoClient("mongodb://localhost:27017")
db = client.myDatabase
fs = GridFS(db)
 
# 存储文件
with open("large_file.bin", "rb") as f:
    fs.put(f, filename="large_file.bin")

读取大文件

# 读取文件
file_data = fs.get_last_version(filename="large_file.bin")
with open("output.bin", "wb") as f:
    f.write(file_data.read())

2. 将文档拆分为多个小文档

适用场景:文档包含大量嵌套数据,导致总大小超过 16MB。

解决思路

  • 将大文档拆分成多个子文档。
  • 使用字段(如 _id 或 parentId)将这些子文档关联起来。

实现步骤

示例:拆分用户日志记录 原始大文档(超 16MB):

{ "_id": "user1", "logs": [ { "timestamp": "2025-01-01", "action": "login" }, ... ] }

拆分为多个小文档:

// 主文档

{ "_id": "user1", "type": "userMetadata" }

// 子文档

{ "parentId": "user1", "logs": [ { "timestamp": "2025-01-01", "action": "login" }, ... ] }

查询时合并:

db.metadata.find({ _id: "user1" });

db.logs.find({ parentId: "user1" });

3. 使用 BSON 对象数组存储引用

适用场景:需要在文档中存储大量关联对象。

解决思路

  • 将大数组分割到其他集合中,主文档存储引用。

示例

大文档超限前:

{ "_id": "project1", "name": "Big Project", "tasks": [ /* 超大量任务数据 */ ] }

优化后:

// 主文档 
{ "_id": "project1", "name": "Big Project" } 
// 任务文档 
{ "projectId": "project1", "taskId": 1, "taskName": "Task 1", ... }

查询时通过 projectId 关联:

db.projects.find({ _id: "project1" }); db.tasks.find({ projectId: "project1" });

4. 压缩数据

适用场景:文档中包含重复数据或可压缩结构(如 JSON 数据)。

解决思路

  • 在存储之前压缩数据(例如使用 GZIP、Zlib 等)。
  • 查询时解压数据。

示例

Python 实现

import zlib
from pymongo import MongoClient
 
client = MongoClient("mongodb://localhost:27017")
db = client.myDatabase
collection = db.myCollection
 
# 压缩存储
data = {"key": "value" * 10000}
compressed_data = zlib.compress(str(data).encode("utf-8"))
collection.insert_one({"_id": "compressed_doc", "data": compressed_data})
 
# 解压读取
doc = collection.find_one({"_id": "compressed_doc"})
decompressed_data = zlib.decompress(doc["data"]).decode("utf-8")

5. 修改数据结构

适用场景:文档设计冗余或结构不合理。

解决思路

  • 简化嵌套层级。
  • 使用更紧凑的数据类型(如数组代替对象)。

优化前

{ "_id": "order1", "customer": { "id": 1, "name": "John Doe" }, "items": [ { "productId": "p1", "productName": "Product 1", "quantity": 2 } ] }

优化后

{ "_id": "order1", "customerId": 1, "items": [ { "p": "p1", "q": 2 } ] }

6. 使用文件系统或其他存储服务

适用场景:非结构化大数据(如媒体文件、大型JSON)。

解决思路

  • 将大数据存储到文件系统、Amazon S3、Azure Blob 等。
  • 在 MongoDB 中存储文件路径或 URL。

总结

  • 优先选择方案
    1. 使用 GridFS 存储大文件。
    2. 拆分文档 或 分表设计 解决超大文档问题。
    3. 结合压缩或外部存储进一步优化。

以上就是MongoDB中单对象大小超16M的存储方案的详细内容,更多关于MongoDB单对象大小超16M的资料请关注脚本之家其它相关文章!

相关文章

  • mongoDB 多重数组查询(AngularJS绑定显示 nodejs)

    mongoDB 多重数组查询(AngularJS绑定显示 nodejs)

    这篇文章主要介绍了mongoDB 多重数组查询(AngularJS绑定显示 nodejs),需要的朋友可以参考下
    2017-06-06
  • MongoDB数据库安装配置、基本操作实例详解

    MongoDB数据库安装配置、基本操作实例详解

    这篇文章主要介绍了MongoDB数据库安装配置、基本操作,结合实例形式详细分析了MongoDB数据库安装配置具体步骤、相关命令与基本操作实现技巧,需要的朋友可以参考下
    2020-01-01
  • MongoDB可视化工具mongodb-compass

    MongoDB可视化工具mongodb-compass

    这篇文章介绍了MongoDB的可视化工具mongodb-compass,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 一次因mongo查询不存在字段引发的事故记录

    一次因mongo查询不存在字段引发的事故记录

    这篇文章主要给大家介绍了关于一次因mongo查询不存在字段引发的事故记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • MongoDB系列教程(三):Windows中下载和安装MongoDB

    MongoDB系列教程(三):Windows中下载和安装MongoDB

    这篇文章主要介绍了MongoDB系列教程(三):MongoDB下载和安装,本文讲解使用Windows环境安装MongoDB,需要的朋友可以参考下
    2015-05-05
  • 在MongoDB中实现时间范围查询的代码详解

    在MongoDB中实现时间范围查询的代码详解

    MongoDB作为一个高性能、开源、无模式的文档型数据库,广泛应用于各种需要灵活数据模型的应用场景中,在处理与时间相关的数据时,MongoDB提供了强大的查询能力,本文将详细介绍如何在MongoDB中执行时间范围查询,需要的朋友可以参考下
    2024-08-08
  • mongodb数据库实验之增删查改

    mongodb数据库实验之增删查改

    这篇文章主要介绍了mongodb数据库实验之增删查改的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • MongoDB模糊查询操作案例详解(类关系型数据库的 like 和 not like)

    MongoDB模糊查询操作案例详解(类关系型数据库的 like 和 not like)

    这篇文章主要介绍了MongoDB的模糊查询操作(类关系型数据库的 like 和 not like) ,本文通过代码案例分析给大家介绍的非常详细,具有一定的参考借鉴价值,,需要的朋友可以参考下
    2019-07-07
  • MongoDB的PHP驱动方法与技巧

    MongoDB的PHP驱动方法与技巧

    这篇文章主要介绍了MongoDB的PHP驱动方法与技巧,需要的朋友可以参考下
    2014-07-07
  • mac下安装和配置mongodb的步骤详解

    mac下安装和配置mongodb的步骤详解

    大家都知道MongoDB是一个跨平台的,面向文档的数据库,提供高性能,高可用性和可扩展性方便。那么下面这篇文章就来给大家介绍了关于在mac系统下安装和配置mongodb的方法步骤,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07

最新评论