mongodb 中的"坑"系列 --- 单个文档16M大小限制

突破极限:MongoDB 16MB 文档限制的实战优化策略 本文深入探讨了MongoDB 16MB文档限制的实战优化策略,通过文档结构重构、分块存储、数据归档和应用层优化四种方法,有效解决大文档存储问题。特别针对BSON格式的特性,提供了避免性能瓶颈的实用技巧和最佳实践,帮助开发者提升数据库性能。 阅读详情
AI摘要

本文探讨了MongoDB中单个文档不能超过16M的限制,指出这种限制可能导致隐形错误,尤其是在无返回码的插入操作中。通过启用安全验证可以及时发现此类错误,但这会牺牲性能。建议的解决方案包括调整数据库结构以避免单文档过大,或使用GridFS存储大数据量信息。

   习惯了使用mongodb中文档(document)存储方式, 可以灵活的将大量数据存入一个集合中的一条文档中, 这样可以减少大量的数据冗余, 不会出现关系性数据库, 如myslq中表的某一列的数据冗余. 不过这样存储虽好, 但其实也会存在一定的问题, 也就是mongodb中的大小限制, 即单个文档大小不能超过16M. 


    对遇到过这个问题的人来说, 这个16M的'概念'很好理解, 而对于还未意识到这个问题的人来说, 这个'坑' 可能会让你花时间都难以发现, 因为这又要牵扯到mongodb的另一个存储机制 ---- 无返回码. 在 < mongodb 权威指南> 一书中, 作者称之为离弦之箭. 什么意思呢, 就是mongodb的插入,删除等操作, 客户端向数据库发出请求之后, 是不需要等待数据库返回操作是否成功的返回结果. 这也是mongodb插入,更新等操作速度快的原因. 这就导致, 当单个文件超过16M之后, 程序并不会报错, 但此时, 数据已经无法插入数据库了.

上代码说明问题:

<span style="font-size:18px;">__author__ = 'ray'

import pymongo
import codecs

def mongo_test():

    fin = codecs.open('test_data.txt', 'r', encoding='UTF-8')   # test_data是一个测试文件, 文件大小为1.1M
    count = 0  
    test.insert({'name': 'test', 'max': 0})   
    line = fin.readline()
    try:
        while count < 20:
            test.update({'name': 'test'}, {'$set': {str(count): line}})   # 循环中每次插入1.1M的数据
            test.update({'name': 'test'}, {'$inc': {'max': 1}}, True)    
            count += 1
    except Exception as e:
        print count, e
    fin.close()


if __name__ == '__main__':
    client = pymongo.Connection('localhost', 27017)
    conn = client.db_wallpaper
    test = conn.test
    mongo_test()</span>
程序输出结果为: 
/usr/bin/python2.7 /home/ray/test/mongo_test.py
Process finished with exit code 0

程序并无异常, 此时查看数据库结果如下:


其实只插入了14条记录, 这种隐形的错误很难被发现. 


有一种策略可以及时发现这个错误, 那就是使用安全验证, 代码很简单, 把

client = pymongo.Connection('localhost', 27017)  ==>> client = pymongo.Connection('localhost', 27017,safe=True)

这样就会有安全验证, 每一次插入会等待上一次的返回结果, 后果就是牺牲mongodb的操作性能. 更新后的结果如下:


而在数据库中, max的值显示为15, 也就是后续的操作就终止了. 


===========================分割线==================================

 很多使用了mongodb的程序员会对此表示不满, 认为这样的设计非常不方便, 因为我们早已经进入了用G, T来衡量数据的时代, 这16M能干什么.  不过按照mongodb的设计思路来看, 这样的限制其实是有助于我们更改不良的数据库结构设计, 因为笔者在shell中做查询时, 面对16M的文档, 查询起来相当慢, 这样的速度是不能够忍受的. 

解决办法:

1: 更改数据表结构, 避免单个文档超过16M, 将数据分开存储, 反正mongodb也比较适合用冗余换取效率. 不妨在同一个集合中多建立几个文档, 分开存储信息

2: 使用GridFS存储大数据量信息, 具体怎么做, 下次再说.


如有问题, 欢迎讨论指正.

完

深入解析MongoDB中的BSON文档大小限制与GridFS的应用 MongoDB作为一种流行的NoSQL数据库,以其灵活的数据模型和高效的性能著称。然而,在使用MongoDB时,开发者常常会遇到BSON文档大小限制的问题:每个文档最大支持16MB。这一限制在处理大规模数据时可能会成为障碍。为了应对这一挑战,MongoDB提供了GridFS,一种用于存储和检索大文件的机制。本文将深入探讨BSON文档大小限制的背景及其解决方案——GridFS,结合实际案例分析,以便更好地理解和应用。在现代应用程序中,数据的存储和处理是至关重要的,尤其是在大数据时代。 阅读详情

相关推荐

告别手动打点!用Cesium为你的大疆无人机快速生成区域巡查航线(保姆级教程)

本文详细介绍了如何利用Cesium平台为大疆无人机快速生成区域巡查航线的保姆级教程。通过自动化航线规划,告别传统手动打点的繁琐操作,实现高效、无死角的区域覆盖。文章涵盖环境搭建、实战案例及高级优化技巧,特别适合无人机操作员和巡检工作者提升工作效率。

weixin_30399821的博客 518

mongodb 16M 限制

mongodb 单个document最大限制为16M。 验证代码如下 调整 sizee大小为16M,ReplaceOne返回错误 “an inserted document is too large”

Zx13170918986的博客 3389

银河麒麟服务器操作系统V10-SP1部署gitlab服务

银河麒麟高级服务器操作系统 V10 SP1 部署GitHub

weixin_43173670的博客 2150

MongoDB笔记二之基本数据操作

MongoShell可以将 shell 连接到任何MongoDB 实例(只要你的计算机与MongoDB 实例所在的计算机 能够连通)。在启动shell 时指定机器名和端口,就可以连接到一台不同的机器(或 者端口): $ mongo some-host:30000/myDB MongoDB shell version: 2.4.0 connecting to: some-host:3000

one-programmer 670

Arduino+NRF24L01 无线遥控舵机与无刷电机系统搭建指南

本文详细介绍了使用Arduino和NRF24L01模块搭建无线遥控系统的完整指南,涵盖舵机和无刷电机的无线控制。从硬件选型、电路连接到代码编写与调试,提供了实用技巧和常见问题解决方案,帮助DIY爱好者低成本实现稳定可靠的无线遥控应用。

sre5engineer的博客 587

e-puck场景搭建

可以注意到一个黑色的小窗口出现在三维视图的左上角。它显示了电子吸盘机器人的摄像头拍摄的图像。该图像将保持黑色,直到机器人的控制器明确启用相机。最后,单击右上角的“x”可以关闭它。在对话框中,选择PROTO节点(Webots项目)/robots/gctronic/e-puck/e-puck(Robot)。一个电子吸盘机器人应该出现在竞技场的中央。通过按Alt+左键单击+拖动,对机器人施加力。无法对WoodenBox节点施加力,因为默认情况下,它们没有质量,并且被视为粘在地板上。将新控制器与机器人链接。

weixin_66540163的博客 765

MongoDB索引优化,你又是一个好MongoDB!

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。什么是索引索引最常用的比喻就是书籍的目录,查询索引就像查询一本书的目录。本质上目录是将书中一小部分内容信息(比如题目)和内容的位置信息(页码)共同构成,而由于信息量小(只有题目),所以我们可以很快找到我们想要的信息片段,再根据页码找到相应的内容。同样索引也是只保留某个域的一部分信息(建立了索引的field的信息),以及对应的文档的位置信息。

weixin_39158966的博客 653

YOLO模型使用jupyterlab的方式进行预测/推理(示例)

首先相信很多使用过python的人都或多或少地了解过这个应用。是一个开源Web应用程序,可让用户创建和共享包含实时代码、公式、可视化和叙述文本的文档。用途包括:数据清理和转换、数值模拟、统计建模、等等。而Jupyter Lab则是Jupyter的下一代笔记本界面。是一个基于Web的交互式开发环境,用于Jupyter notebook、代码和数据。非常灵活,可支持数据科学、科学计算和机器学习领域的广泛工作。是可扩展和模块化的,其可编写插件来添加新组件并与现有组件相集成。

ocean00008899的博客 901

MongoDB-处理速度变慢问题(索引能提高3倍的搜索速度)

问题:之前在另一台电脑已经搭好的项目,在跑上传并储存数据到数据库的时候,总耗时只要10s。后来将项目重新部署到一个新电脑上面,重新搭好环境,跑同一段代码的时候,总耗时变成;了30s。经过研究,发现代码中主要的耗时在mongoDB的update中,而且update命令也是要有查询操作的,在原来的项目中,mongoDB里的索引已经建立好。在换到新电脑的时候,没有想到这一层面,导致运行速度降低了66%。...

Jamin2018的博客 3533

杰理的蓝牙芯片的key是什么?以及该如何添加key?杰理key文件原理

很多的工程师,在开发杰理蓝牙芯片的第一步就会有一个很深的疑惑,关于key的 1、什么是key文件? 2、Key文件是如何产生的? 3、为什么需要他key文件? 4、如何添加key文件? 5、以及实际开发中的一些报错该如何处理?

qyvhome的博客 4094

Kali Linux实战:Aircrack-ng破解Wi-Fi密码的完整流程与常见问题解决

本文详细介绍了在Kali Linux中使用Aircrack-ng套件进行Wi-Fi密码破解的完整流程,包括环境准备、无线网卡配置、网络扫描、握手包捕获与字典破解等关键步骤。同时针对无线网卡不支持监听模式、无法捕获握手包等常见问题提供了实用解决方案,帮助安全研究人员有效评估无线网络安全性。

weixin_29323049的博客 296

python解决Mongodb 管道聚合后单文档16M限制

最近产品定位一个问题,因为代码里面使用了管道聚合(aggregate)后,导致几万个数据里面有超过16M的数据,从而报了一个&amp;quot;BSONobj is invaild. Size must between 0 and 16M&amp;quot;的一个错。百度了一下,上面说的是一个document文档最大尺寸为16M,而超过了16M后就要存到GridFS中,但是我们的mongodb不能修改表结构,不能重启,总之就是不能动...

查理曹的博客 1万+

基于聚类特征工程的水果销量预测:聚类算法对比与多模型评估

水果销量预测研究:聚类分群与多模型对比 摘要 本研究提出了一种融合聚类分析与机器学习的水果销量预测方法。基于包含12个维度的销售数据集,首先采用K-Means、BIRCH和DBSCAN三种聚类算法对水果品类进行分群,通过轮廓系数等指标评估显示BIRCH算法表现最优(0.387)。随后针对不同群组构建差异化特征工程,并比较XGBoost、LightGBM和LSTM三种预测模型性能。实验结果表明:基于聚类特征工程的LightGBM模型预测效果最佳(RMSE=2.34,R²=0.87).

huanghm88的专栏 137

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

使用 MongoDB 驱动的 GridFS 工具存储文件。:文档中包含重复数据或可压缩结构(如 JSON 数据)。:文档包含大量嵌套数据,导致总大小超过 16MB。在 MongoDB 中,单个文档的大小限制为。:非结构化大数据(如媒体文件、大型JSON)。:需要存储大文件(如图像、视频、文档等)。:需要在文档中存储大量关联对象。:文档设计冗余或结构不合理。

yuanpan的专栏 2432

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

mongodb文档太大,MongoDB单文档大小限制为16MB

Known Information: Its is know that MongoDB stores in BSON (Binary JSON) and the maximum BSON document size is 16MB.Question: Why 16MB itself why not 32MB or 64MB or still more and where exactly the l...

weixin_39692245的博客 1628

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Mongodb 不能存储大于16M的文件

啊啊啊!踩坑了! 由于切换数据库的原因,需要从couchdb数据库中将模型文件给拉取到mongodb数据库中,谁知道模型文件存储到mongodb中总是少1000来条,代码也没报错啊,怎么回事??? 原来如此 mongodb 中的"坑",— 单个文档16M大小限制 对遇到过这个问题的人来说,这个16M很好理解, 而对于还未意识到这个问题的人来说,这个’坑’ 可能会让你花时间都难以发现,因为这又要牵扯...

ZCR的博客 8516

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

MongoDB限制与阈值

以下内容是有关MongoDB的单个集合在硬件和软件上的限制。 BSON文档 单个Bson文档最大为16M。该限制是为了保证单个文档不会占用过多RAM、在网络传输过程中不会占用过多带宽。MongoDB提供了GridFS来保存超过该限制的文档。具体可参考mongofiles。 Bson文档的最深内嵌深度为100。   命名空间(namespaces) 每个命名空间长度必须小于123 byt

y943623901的专栏 1万+

Mongodb 管道聚合后单文档限制

mongodb使用管道聚合(aggregate)后 有时数据量几万条,当数据量过大,超过限制报错 BSONobj is invaild. Size must between 0 and 16M 原因是 是一个document文档最大尺寸为16M,而超过了16M后就要存到GridFS中 由于mongodb不能去修改表结构,不能重启 开始也有想过加一个参数{“allowDiskUse”: Tru...

WJ844908240的博客 726

MongoDB聚合管道的限制

MongoDB聚合管道功能非常丰富且强大,能够实现各种复杂的聚合查询和数据处理,我们在利用强大功能的同时,也需要了解其限制和约束,这样才能在系统设计时做到用其长避其短。聚合管道的限制主要有几个方面,分别是结果结果、阶段数量、内存等三个方面的限制。

superatom01的博客 1218

mongodb附件大小限制

某系统进行厂商选型,说到mongodb存储的附件大小有16M显示,记得以前也部署过,没有遇到这个限制。重新找了相关资料。一、BSON文档    1、BSON文档尺寸:一个document文档最大尺寸为16M;大于16M的文档需要存储在GridFS中。    2、文档内嵌深度:BSON文档的结构(tree)深度最大为100。原来之前是用Nginx+GridFS插件。二、2G文件限制    32位系统...

newtelcom的专栏 1956

Navicat连接MongoDB字段显示Bug,MongoDB 存储限制,GirdFS

Navicat连接MongoDB字段显示Bug,MongoDB 存储限制,GirdFS

MovemOemVeovE的博客 702

MongoDB事务最大限制大小

MongoDB事务最大限制大小记录一次MongoDB的事务处理事件原因是否发生了写冲突?确定是事务异常?对比两侧环境差异为啥我一个事务操作的大小超过了16M? 记录一次MongoDB的事务处理 事件原因 MongoDB在4.0开始引进事务,因业务的某个场景需要用到MongoDB的事务操作,但在某次线上的某一条数据在修改时一直报`org.springframework.data.mongodb.UncategorizedMongoDbException: Command failed with error 1

小猛同学的博客 2303

Mongodb参数限制和阀值

    Mongodb中有一些限制,需要开发者预先了解   一、BSON文档     1、BSON文档尺寸:一个document文档最大尺寸为16M;大于16M的文档需要存储在GridFS中。     2、文档内嵌深度:BSON文档的结构(tree)深度最大为100。   二、Namespaces     1、collection命名空间:&lt;database&gt;.&lt...

深入一点 815

MongoDB 使用规范与限制及最佳实践

MongoDB 灵活文档的优势 灵活库/集合命名及字段增减 同一字段可存储不同类型数据 Json 文档可多层次嵌套文档 对于开发而言最自然的表达 MongoDB 灵活文档的烦恼 数据库集合字段名千奇百怪 同一字段数据类型各不一样 业务异常可能写入“脏”数据

m0_37062111的博客 1280
上一篇: python 列表 字典 string 互相转换
下一篇: [python] mongodb 存储优化 --- 文档设计
rayimpr
博客等级 码龄13年 6粉丝 14原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值