MongoDB 新增文档时提示 “Size of BSON document exceeds maximum allowed”,怎么办?

背景

在使用 MongoDB 时,有时会遇到错误提醒:“Size of BSON document exceeds maximum allowed”。这个错误信息表示 BSON 文档的大小超过了MongoDB设定的最大值,导致无法插入该文档。

原因

在 MongoDB 中,每个文档(document)的大小不能超过 16 MB。实际上,在插入文档时,虽然没有为文档明确指定大小限制,但 MongoDB 会自动限制文档大小,防止出现过大的文档,从而导致服务器性能下降。

如果超过 16 MB(尤其是当文档中包含大量嵌套对象时),MongoDB 将无法处理这些文档,并提示错误信息:Size Of BSON Document Exceeds Maximum Allowed。

解决方法

方法一:使用 GridFS 存储大文档

GridFS 是 MongoDB 的一个文件存储机制,可以存储超过 16 MB 的大型文件(诸如图片、音频、视频等)。使用 GridFS,可以将大文档拆分为多个 BSON 文档存储。

以下是示例代码:

-- ----
--- ------- -------

----- - ----------- - - ------------------
----- - -------- - - -----------------

----- --- - ---------------------------
----- ------ - --- ----------------

----- ----------------

-- ----------
----- ------ - ------------------ --------
----- -------------- - --- ----------
-------------------- - -- -- --
---------------------------
-------------------------

-- ---- ------------
----- ------ - --- --------------------------------- -
  ----------- ------
--

----- ------------ - -----------------------------------
---------------------------------

------------------------- -- -- -
  -------------------
--

方法二:拆分嵌套文档

如果无法使用 GridFS,则可以将过大的文档拆分为多个较小的文档。尤其是对于包含大量嵌套对象的文档,可以考虑拆分为多个文档来存储。

以下是示例代码:

----- - ----------- - - ------------------

----- --- - ---------------------------
----- ------ - --- ----------------

----- ----------------

----- ---- - ------------------------------

-- ----------------
----- --- - ----- ------ -------------- ----- --------------- ---- -------------
----- --------- - ---- - ---- -- - --
--- ---------- - -------------------

----- ------------------ - -- -
  -- ------------ -- --
  ----- --- - --------------------------- ----------
  ----- --- - ------------------- ----
  ---------- - ---------------------

  ----- ---------------------- -----
-

----- --------------

方法三:重新设计数据模型

如果一篇文档确实需要存储大量数据,那么可以重新设计数据模型,将大型数据拆分并分别存储到多个文档中,并使用引用关系将它们关联。这样将会降低单个文档的大小并提高数据库操作性能。

以下是示例代码:

----- - ----------- - - ------------------

----- --- - ---------------------------
----- ------ - --- ----------------

----- ----------------

-- ------
----- --------- - -------------------------------
----- ---------- - --------------------------------

-- --------
----- ---- - -
  ----- ------
  ---- ---
  -- -------------------- ------- --
  ------- ------------------------------- -------- --------- ------- ----------- ------ --------
-

-- --------
----- ----- - -
  -------- --------
  --------- ------- ----------- ------ -----
-

----- -------------------------

总结

当出现 MongoDB 提示错误“Size of BSON document exceeds maximum allowed”时,我们可以尝试使用 GridFS 存储大文档,或者拆分嵌套文档,或者重新设计数据模型来存储数据,以避免单个文档过大、性能下降等问题。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/649a871748841e989476d094


猜你喜欢

  • ES7 中的 Array.prototype.find() 和 Array.prototype.findIndex() 方法

    ES7 中的 Array.prototype.find() 和 Array.prototype.findIndex() 方法 在 ES6 中,我们已经接触到了 Array 类型的新加强,如 Array...

    1 年前
  • 在无法与 Jest 单元测试之间的关系中使用 TypeScript

    在前端开发中,单元测试是一个必不可少的环节。而在通过 Jest 进行单元测试时,使用 TypeScript 提供的类型检查能够帮助开发者更快速地发现和解决代码中的问题。

    1 年前
  • React Native 中如何使用 WebView 组件

    在 React Native 中,WebView 组件可以让我们在原生应用中嵌入 Web 页面,实现更加丰富的交互功能。本文将详细介绍如何在 React Native 中使用 WebView 组件,并...

    1 年前
  • 在 ES10 中使用 Optional catch binding 更安全地处理错误

    在 ES10 中使用 Optional catch binding 更安全地处理错误 在前端开发中,我们经常会遇到各种错误,如网络请求失败、函数调用异常等。这些错误如果不加处理将会导致程序崩溃或者数据...

    1 年前
  • 解决 Hapi 框架中的错误:Cannot find module 'hapi-auth-cookie'

    引言 在使用 Hapi 框架时,我们经常会遇到各种错误。其中一种常见的错误是 Cannot find module 'hapi-auth-cookie'。这个错误通常出现在使用 Hapi 的身份验证插...

    1 年前
  • SASS的伪元素选择器

    前言 SASS是一门CSS预处理器,它为CSS引入了许多新的特性和简化了CSS的编写方式。在SASS的世界中,伪元素选择器也和CSS有所不同,但同样具有强大的功能。

    1 年前
  • Vue.js 中如何使用 Vuex 管理组件状态(附代码实例)

    如果你正在使用 Vue.js 开发一个大型的单页应用程序 (SPA),你会发现组件中的状态管理会越来越复杂。为了解决这个问题,Vue.js 团队提供了一个官方库叫做 Vuex。

    1 年前
  • RESTful API 中的数据加密指南

    在日常的 Web 开发中,当涉及到隐私数据传输的时候,我们需要保证数据的安全性。RESTful API 是一种常用的数据传输方式,所以在 RESTful API 的设计中,数据加密是很重要的一环。

    1 年前
  • # Koa2 中的 async/await 用法详解

    Koa2 中的 async/await 用法详解 Koa2 是一个轻量级的 Node.js Web 框架,使用它可以轻松地构建 Web 应用程序和 API。在 Koa2 中,async/await 成...

    1 年前
  • Sequelize 中如何使用批量操作实现数据新增或更新

    Sequelize 是一个基于 Node.js 实现的 ORM 框架,用于操作 SQL 数据库。在实际开发中,我们会经常遇到需要批量新增或更新数据的情况。本文将介绍如何使用 Sequelize 实现数...

    1 年前
  • Redis 分布式锁性能优化详解

    前言 在分布式应用场景下,为了保证数据的准确性和系统的稳定性,常常需要使用分布式锁来协调并发访问。Redis 作为一种高速,可扩展的键值存储解决方案,除了提供基本的数据结构和高效的缓存机制,还支持分布...

    1 年前
  • 解决 Mongoose 中使用 findOne 方法查询错误的问题

    在使用 Mongoose 的时候,我们经常会使用 findOne 方法来进行单个文档的查询。但是有时候我们会遇到查询结果并不如预期的情况,这时候我们需要检查自己的代码,并且了解一些常见的问题。

    1 年前
  • ES2021 中全新的 String.replace 全局替换 Regex 解析

    在 JavaScript 开发中,字符串替换是一项常见的任务。在 ES2021 中,全新的 String.replace 方法可以更方便地完成字符串替换任务。该方法支持全局替换,同时还支持使用正则表达...

    1 年前
  • LESS 中的字符串函数详解

    在前端开发中,使用 LESS(Leaner CSS)预处理器可以大大提高 CSS 的开发效率和维护性。LESS 提供了众多的内置函数来处理样式,特别是字符串函数,使得在操作字符串时更加灵活和方便。

    1 年前
  • 使用 Socket.io 进行物联网数据实时处理

    使用 Socket.io 进行物联网数据实时处理 随着物联网技术的发展,越来越多的设备需要进行数据的实时处理,传统的基于 HTTP 协议的 RESTful API 已经无法满足这种需求。

    1 年前
  • 使用 Chai 进行接口测试:如何判断数组中对象属性的顺序?

    在前端开发中,接口测试是一个非常重要的环节。而 Chai 是一个流行的 JavaScript 测试库,能够帮助我们方便地编写接口测试脚本。但是在进行接口测试时,如果需要判断数组中对象属性的顺序,可能会...

    1 年前
  • 性能优化实战:前端事件优化实践

    随着 Web 应用程序的复杂化,用户与应用的交互愈发频繁。在这种情况下,有时候前端事件处理也会变得复杂,很容易出现性能问题。本篇文章将介绍一些前端事件优化的实践,以帮助你优化你的 Web 事件处理和提...

    1 年前
  • 避免 CSS Reset 引起的图片对齐不准问题

    避免 CSS Reset 引起的图片对齐不准问题 在进行前端开发时,我们经常会使用 CSS Reset 来清除浏览器默认样式,以便更容易地实现自己的设计。然而,CSS Reset 牵扯到诸多问题,其中...

    1 年前
  • 使用 Deno 和 Vue.js 开发全栈应用

    随着前端技术的不断发展,全栈开发也越来越受到关注。本文将介绍如何使用 Deno 和 Vue.js 开发全栈应用。Deno 是一种新的 JavaScript 运行时,它具有安全性、快速性和可扩展性等特点...

    1 年前
  • Node.js 中如何使用 Redis 进行数据缓存?

    随着 Web 应用的普及,数据缓存在前端开发中变得越来越重要。Node.js 中使用 Redis 进行数据缓存是一种常见的做法。本文将详细介绍如何在 Node.js 中使用 Redis 进行数据缓存,...

    1 年前

相关推荐

    暂无文章