首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Mongo / mongoose排序错误操作使用的内存超过最大字节数。我无法使索引工作

基础概念

MongoDB 是一个基于分布式文件存储的开源数据库系统,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。Mongoose 是一个用于 Node.js 的 MongoDB 对象建模工具,它提供了一种直接的方式来在 Node.js 应用程序中使用 MongoDB。

相关优势

  • 高性能:MongoDB 提供了高性能的数据持久化。
  • 灵活的数据模型:支持动态模式,易于扩展。
  • 高可用性:支持复制集和分片,提供高可用性和数据冗余。
  • 丰富的查询语言:支持复杂的查询操作。

类型

MongoDB 支持多种数据类型,包括文档、数组、日期等。

应用场景

适用于需要灵活数据模型、高性能读写操作、大数据量处理的场景,如 Web 应用、实时分析、内容管理系统等。

问题分析

当你在使用 Mongoose 进行排序操作时,如果遇到“内存超过最大字节数”的错误,这通常是因为 MongoDB 在执行排序操作时需要将大量数据加载到内存中,如果数据量过大,可能会超出 MongoDB 配置的内存限制。

原因

  1. 数据量过大:排序的数据集超过了 MongoDB 可用的内存。
  2. 索引未正确使用:没有为排序字段创建索引,导致 MongoDB 需要进行全表扫描。
  3. 配置限制:MongoDB 的内存使用可能受到了配置文件或系统资源的限制。

解决方法

创建索引

确保为排序的字段创建索引,这样可以显著提高排序操作的效率。

代码语言:txt
复制
db.collection.createIndex({ fieldToSort: 1 });

增加内存限制

如果可能,增加 MongoDB 的内存限制。这通常需要在 MongoDB 的配置文件中进行设置。

代码语言:txt
复制
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

net:
  bindIp: 127.0.0.1,your.host.ip
  port: 27017

processManagement:
  fork: true

setParameter:
  internalQueryExecMaxBlockingSortBytes: 536870912 # 设置为 512MB

分页查询

如果数据量非常大,可以考虑使用分页查询来减少每次排序操作的数据量。

代码语言:txt
复制
db.collection.find().sort({ fieldToSort: 1 }).skip(pageNumber * pageSize).limit(pageSize);

使用聚合管道

对于复杂的排序需求,可以使用聚合管道来实现。

代码语言:txt
复制
db.collection.aggregate([
  { $sort: { fieldToSort: 1 } },
  { $skip: pageNumber * pageSize },
  { $limit: pageSize }
]);

参考链接

通过上述方法,你应该能够解决 MongoDB 在排序操作中使用内存超过最大字节数的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MongoDB系列一: Replica Set 集群搭建实战

随着内部产品业务搭建,单机mongo已经无法满足生产需求,对于单机迁移、损坏等问题,简单单机数据备份已经无法满足,因为采用了集群方式来满足容灾以及数据快速恢复等功能,下面就来讲讲如何搭建集群来避免这些问题...准备工作 机器信息: 3 台机器 mongo1 mongo2 mongo3 环境: CentOS 6.5 采用策略 Mongo有三种集群方式 1.Replica Set副本 2.Sharding分片 3...自动故障转移,当主节点与集合中其他成员通信时间超过配置electionTimeoutMillis期间(默认为10秒)时,符合条件复制节点将会被选举成新主节点。...采用是 keyFile 方式 由于一开始没有采用这个方式,直接采用 auth=true 方式,导致一直报以下错误。...这里采用是 rsync 方式。 所以我们还得配置 ssh。

3.9K41

MongoDB GridFS 怎么用

MongoDB 最大特点是它支持查询语言非常强大,其语法有点类似于面向对象查询语言,几乎可以实现类似关系数据库单表查询绝大部分功能,而且还支持对数据建立索引。...当你想访问大型文件部分信息,却不想加载整个文件到内存时,您可以使用GridFS 存储文件,并读取文件部分信息,而不需要加载整个文件到内存。...我们使用场景 所在团队负责一个在线设计平台,我们有大量设计稿文件需要上传到服务器上,即允许设计师在平台上传 PSD / SKETCH 等设计源文件。...MongoDB 集合命名包括了数据库名字与集合名字,会将数据库名与集合名通过“.”分隔,而且命名最大长度不得超过 120bytes。...fs.files 集合使用是“filename”与“uploadDate” 字段作为唯一、复合索引。fs.chunk 集合使用是“files_id”与“n”字段作为唯一、复合索引

4.3K20
  • mongodb原生node驱动

    写在前面 最近读《node.js学习指南》,对于mongodb没有介绍太多工作原理,但是对于一个前端开发者,即使你还没有用过这种数据库也可以让你很好理解和使用 一本非常好介绍node.js书,一直把他放在触手可及地方...)、     Skip(skip n个文档,用于跳页)     Hint(告诉数据库使用特定索引)     returnKey(只返回索引key)     Comment(为查询在log日志文件中添加描述...这些选项值我们同样可以在mongo使用,进行数据一些操作 1、接下来我们来用find()查询并返回我们数据库内容,可以直接使用toArray()方法将结果转化为数组 2、使用可选值field来进行筛选...虽然原始驱动提供了数据库连接,但是缺少更高级别的抽象,有些繁琐,所以有时候你需要使用类似mongooseODM, mongoose构建在mongodb之上,提供了Schema、Model和Document...下一次我会总结一下使用express + mongoose建立数据库连接

    2.6K60

    技术分享 | MongoDB 一次排序超过内存限制排查 setParameter:

    技术分享 | MongoDB 一次排序超过内存限制排查 本文目录: 一、背景 1. 配置参数检查 2. 排序字段是否存在索引 二、测试环境模拟索引排序影响 1. 测试环境信息 2....more than the maximum 33554432 排序操作超过了MongoDB单个Session排序使用最大内存限制。...totalDocsExamined:文档扫描总行数 memUsage:Sort 使用内存排序操作使用内存大小 memLimit:MongoDB 内部限制Sort操作最大内存 上述执行计划表明查询语句在未使用索引排序情况下如果排序使用内存超过...Stage,官方文档说明了使用内存排序使用最大内存为100M,若需要避免报错则需要添加 {allowDiskUse : true} 参数。...使用索引扫描效率是远大于直接将结果集放在内存排序,所以MongoDB为了使查询语句更有效率执行,限制了 排序内存使用,因而规定了只能使用 32M,该种考虑是非常合理

    1.2K30

    技术分享 | MongoDB 一次排序超过内存限制排查

    more than the maximum 33554432 排序操作超过了MongoDB单个Session排序使用最大内存限制。...文档中意思大概是:在排序字段未利用到索引情况下,若超过32M内存则会被Abort,语句直接返回报错。...totalDocsExamined:文档扫描总行数 memUsage:Sort 使用内存排序操作使用内存大小 memLimit:MongoDB 内部限制Sort操作最大内存 上述执行计划表明查询语句在未使用索引排序情况下如果排序使用内存超过...Stage,官方文档说明了使用内存排序使用最大内存为100M,若需要避免报错则需要添加 {allowDiskUse : true} 参数。...使用索引扫描效率是远大于直接将结果集放在内存排序,所以MongoDB为了使查询语句更有效率执行,限制了 排序内存使用,因而规定了只能使用 32M,该种考虑是非常合理

    3.3K60

    三步带你开发一个短链接生成平台

    现在市面上可用就是微博t.cn和一些第三方生成短链接工具,但这两类工具都有一些使用问题,例如:t.cn现在规则是会出现一个中转页不会直接跳转,而第三方工具因为是一个公共平台,有时可能会因一些不良信息导致整个平台无法访问...为了高效,使用是node和mongodb,下面我们就来开始动手吧。...和shortid和body-parser npm install mongoose npm install shortid npm install body-parser 下面分别对使用这三个包简单说明一下...由于我们生成短链接部分api使用是post方法,使用body-parser可以多扩展一种body编码类型解析能力。...因为这个应用我们只有生成和Redirect两个功能,所以这里只有两个页面即可完成所有工作

    3.1K30

    【翻译】MongoDB指南引言

    此外,先进先出特性保证了事件顺序,同时管理了存储使用。 在固定集合中缓存少量数据。由于缓存重读而非写,你应确保这个集合总在工作集中(例如,内存中)或接受一点点写操作,因为索引需要写操作。...为了使查询结果排序与插入时相反,可以使用sort() 方法并将$natural参数设置为-1: db.cappedCollection.find().sort( { $natural: -1 } )...这些索引允许你利用一种特殊类型使数据过期并从普通集合中移除,这种特殊类型是基于时间字段值和TTL值。 TTL集合与固定集合不兼容。...设置单个文档大小最大值有助于确保单个文档不会耗尽系统内存,或者在传输过程中不会占用太多带宽。为了能够存储超过最大文档,MongoDB提供了GridFS API。...对于数组而言,小于比较或者升序排序比较是数组中最小元素,大于比较或者降序排序比较是数组中最大元素。

    4.2K60

    最佳实践| 一文读懂《MongoDB 使用规范及最佳实践》原理

    多列索引列个数最多不超过 31 前台模式 createIndexes内存限制500 MB (maxIndexBuildMemoryUsageMegabytes 可调整) 不允许创建多列数组组合索引...答:提高选举效率、减少心跳网络代价 1.6 分布式集群限制 分片 key 最大长度不能超过 512 字节 分片 key 索引类型不能是 text 、数组索引和 geo 索引 分片集合单个文档条件操作必须带分片...,加快资源释放 默认事务申请锁等待时间 5 ms 如果超时即崩溃退出 1.8 其他限制 全集合扫描排序内存限制 32 MB [否则报错] 最佳实践: 为排序添加索引;控制排序数据量 Aggregation...管道操作内存限制 100 MB 最佳实践: 控制计算数据量 调整 allowDiskUse 允许磁盘排序 bulkWrite 操作每批最大操作数限制 1000 或 10 w (>= 3.6) 最佳实践...实际上特别简单,不用去计算它每个字段字节数或者有多少索引,每个索引字段对应字节数,直接拿真实环境或者跟线上环境类似的测试环境直接模拟写数据,然后直接去查看对应一个数据大小就可以。

    2.4K50

    pymongo.errors:Sort operation used more than the maximum 33554432 bytes of RAM. Add an index,

    mongo 使用过程中遇到了一个问题,需求就是要对mongo 库中查询到数据进行分页,mongo库我们知道都会存储大容量数据,刚开始使用 skip 和 limit 联合使用方法,来达到截取所需数据功能...按照错误提示,知道这是排序时候报错,因为 mongo sort 操作是在内存中操作,必然会占据内存,同时mongo一个机制限制排序最大内存为 32M,当排序数据量超过 32M,就会报上面的这个错...,解决办法就像上面提示意思,一是加大 mongo 排序内存,这个一般是运维来管,也有弊端,就是数据量如果再大,还要往上加。...; 这两个语句,第一个是添加索引,第二个是查询索引,如果查看到你刚才添加那个索引字段,就说明索引添加成功了。...这时候在你程序里再运用 sort 方法的话,这样就不会报错而且速度很快。 添加索引会带来一定弊端,这样会导致数据插入时候相对之前较慢,因为索引会占据空间

    1.5K30

    pymongo.errors:Sort operation used more than the maximum 33554432 bytes of RAM. Add an index,

    mongo 使用过程中遇到了一个问题,需求就是要对mongo 库中查询到数据进行分页,mongo库我们知道都会存储大容量数据,刚开始使用 skip 和 limit 联合使用方法,来达到截取所需数据功能...按照错误提示,知道这是排序时候报错,因为 mongo sort 操作是在内存中操作,必然会占据内存,同时mongo一个机制限制排序最大内存为 32M,当排序数据量超过 32M,就会报上面的这个错...,解决办法就像上面提示意思,一是加大 mongo 排序内存,这个一般是运维来管,也有弊端,就是数据量如果再大,还要往上加。...; 这两个语句,第一个是添加索引,第二个是查询索引,如果查看到你刚才添加那个索引字段,就说明索引添加成功了。...这时候在你程序里再运用 sort 方法的话,这样就不会报错而且速度很快。 添加索引会带来一定弊端,这样会导致数据插入时候相对之前较慢,因为索引会占据空间

    98760

    Node.js 服务连接 MongoDB 处理最佳实践

    关于如何处理 node.js 服务连接 MongoDB,查阅了大量中英文资料,发现并没有太适合所期望能力方案,因此经过一番官方文档研究,总结了以下连接 MongoDB 方法(使用目前 Node.js...) module.exports = { mongoInstance } 这套连接方法能够满足以下需求,当然,这也是从服务需要满足需求中总结而来: 开发环境下能够打印详细数据库操作信息...对于 MongoDB 连接池问题,建议是不要去手动处理。mongoose 自己会维护一个默认最大数量为 5 连接池,只有当你发现有一些慢查询可能阻塞快查询时才应该考虑增大 poolSize。...解决方法也不是没有,就是比较鸡肋:在 mongoose 连接 'error' 事件监听回调函数中尝试重连。但是需要设置最大重试次数,否则会发生内存泄露。...比较鸡肋原因是,如果首次连接没有成功,短时间内尝试重连几次貌似也无济于事。因此,使用这套连接方式务必要注意数据库保持可连接状态。或者读者们如果有更好解决方案,也希望能不吝赐教。 完。

    3.5K20

    3-5年PHPer常见面试题

    in_array(),array_key_exists 哪一个更好 怎样判断select语句中是否使用索引?explain 等使用 sphinx中文分词词库使用第三方库还是自己建库?...安装linux软件时使用make方式还使用yum方式? linux网络优化,如何查看进程、怎样查看最大文件打开数? 1条微薄要推送给100万个粉丝该怎么处理? 知道哪些算法?冒泡排序?快速排序?...C语言中虚函数是什么? C排序算法有哪些? php 基本结构是什么? memcache magent 分布式设计? php内存回收机制是什么?...给你256M内存,对10G文件进行排序(文件每行1个数字),如何实现? 对10G文件进行查找如何实现? 统计10G文件每个关键字出现次数如何实现?...所有问题都问完了(当然没有这么多),你有什么问题问我没有?

    1.3K100

    使用MongoDB开发过程常见错误分析

    本文主要讨论这几个问题: Mongo shell中使用大整数字面量 片键使用自增长字段 程序里游标循环迭代过程中进行长时间操作 滥用数组类型 滥用upsert更新参数 错误设计索引 错误认为复制等于备份...(本文讨论在社区交流群以及工作开发过程中常见一些错误。)...所以当我们在mongo shell中直接使用整数字面量时,实际上它是以double表示,而当这个整数字面量大约超过16位数字时,就可能发生有些整数无法精确表示情况,只能使用一个接近能表示整数来替代...但问题是,首先,在MongoDB中文档有大小限制,目前版本中每个文档最大不能超过16M,所以使用内嵌文档存储无法满足粉丝或关注好友增长需求,大用户节点可能将会有大量粉丝或关注用户,超过16M,届时程序将很难扩展...是否可以建立复合索引,复合索引字段如何组织顺序,才能使得复合索引能够覆盖更多查询需求,满足范围查询需求,满足排序需求(通常复合索引中,按照等值查询、排序、范围查询顺序来组织索引字段,同时结合考虑索引选择性

    2.4K30

    大数据技术之_22_MongoDB学习_MongoDB 简介、下载、安装、启动、配置和关闭 + MongoDB 基本操作 + Mongoose + 使用 java 对 MongoDB 增删改查

    • 我们程序都是在内存中运行,一旦程序运行结束或者计算机断电,程序运行中数据都会丢失。   • 所以我们就需要将一些程序运行数据持久化到硬盘之中,以确保数据安全性。...(升序) //sort() 可以用来指定文档排序规则,sort() 需要传递一个对象来指定排序规则,1 表示升序显示该字段数据;-1 表示降序显示该字段数据,0 表示不显示该字段数据。...//limit、skip、sort 可以以任意顺序进行调用 db.emp.find({}).sort({sal: 1, empno: -1}); // 按照工资升序排序,工资相同时按照员工编号降序排序...一旦创建好了 Model 对象,就会自动和数据库中对应集合建立连接,以确保在应用更改时,集合已经创建并具有适当索引,且设置了必须性和唯一性。   ...conn_mongo.js var mongoose = require("mongoose"); mongoose.connect("mongodb://127.0.0.1/mongoose_test

    17.8K30

    优化MongoDB复合索引

    在本篇文章中,将展现一种给读请求定制索引优化方法,这种方法会考虑读请求中比较,排序以及范围过滤运算,并展示符合索引中字段顺序最优解。...最优索引必须包含查询所有过滤字段和排序字段。另外,所有的范围过滤字段或排序字段必须跟在等式过滤字段后面。如果有多个满足条件索引Mongo会选择任意一个。...需要有一个索引,能让MongoDB快速定位到非匿名区,并以rating字段由大到小顺序扫描该区。 ? MongoDB会使用这个索引吗?并不会,因为这个索引无法在查询优化器选择中胜出。...因为他nscanned不是最低。 查询优化器可不管索引是否对排序有帮助。 不过我们可以使用Hint字段强制Mongo使用索引 ?...如果某些字段不会被查询条件使用到,那就不需要将其加入索引中,这样可以减小索引大小。此外,如果某个字段作为索引无法过滤掉90%以上数据,就建议将其从索引中忽略。

    2.8K30

    优化MongoDB复合索引

    在本篇文章中,将展现一种给读请求定制索引优化方法,这种方法会考虑读请求中比较,排序以及范围过滤运算,并展示符合索引中字段顺序最优解。...最优索引必须包含查询所有过滤字段和排序字段。另外,所有的范围过滤字段或排序字段必须跟在等式过滤字段后面。如果有多个满足条件索引Mongo会选择任意一个。...需要有一个索引,能让MongoDB快速定位到非匿名区,并以rating字段由大到小顺序扫描该区。 ? MongoDB会使用这个索引吗?并不会,因为这个索引无法在查询优化器选择中胜出。...因为他nscanned不是最低。 查询优化器可不管索引是否对排序有帮助。 不过我们可以使用Hint字段强制Mongo使用索引 ?...如果某些字段不会被查询条件使用到,那就不需要将其加入索引中,这样可以减小索引大小。此外,如果某个字段作为索引无法过滤掉90%以上数据,就建议将其从索引中忽略。

    2.9K20

    Week14-服务端选型:磨刀不如砍柴功

    这里,讲师再次推荐了自己一个课程,鉴于此次购买课程自己不是很满意,这里,觉得自己补充mongoose基础知识就够了,总结至:https://www.yuque.com/liugezhou/gofftg...如图显示这个版本是5.0.8,也就是说之前电脑上其实是有redis新安装这个6.0.9并没有用上。...然后,继续查看目录,发现之前安装5.0.8版本,其实在 /usr/local/redis-5.0.8下面,而且不是使用brew安装 因此,又把刚刚安装redis删除: brew...优缺点 优点:不占用服务器内存、多进程,多服务器,不受影响、不受跨域限制 缺点:无法快速封禁登录用户。...: true, // 多个实例,合并日志 max_memory_restart: '300M', // 内存占用超过 300M ,则重启,可使用 pm2 monit查看初始内存占用,然后根据初始设置

    2K30

    React、TypeScript、NodeJS 和 MongoDB 搭建 Todo App

    我们还有一个 app.ts,它是服务器入口。控制器、类型和路由也在它们各自以它们命名文件夹中。 现在,我们需要配置 tsconfig.json,使编译器运行我们首选项。...在编译时会排除数组中文件或文件夹 现在我们安装依赖项,使项目可以使用 TypeScript。...接下来,使用类型转换来避免拼写错误,并限制 body 变量与 ITodo 类型匹配,然后基于该模块创建一个新 Todo。...用 React 和 TypeScript 创建客户端 构建 为了创建一个新 React 应用,将会使用 create-react-app ——你可以用其他你想用方法。...最值得注意是 src/type.d.ts 被用来存放类型。几乎在每个文件中都使用了它们,所以我添加了扩展 .d.ts ,使类型全局可用。现在我们不再需要导入它们。

    17K30

    存储优化(2)-排序引起慢查询优化

    例3 某日线上服务报警:API响应时间超过X毫秒 通过查看应用日志,发现大量 com.mongodb.MongoSocketReadTimeoutException:mongo错误。...":23},"sort":{"_id":-1},"limit":1}} 索引是bizId,version联合索引 问题分析 这几个查询造成线上问题形式虽然各有不同,但本质上都是一样,无法利用索引排序...,需要用到数据库排序,当内存够大或没超过排序上限时,就会在内存排序,这样单个查询相对比较快,但是并发量高了,内存容量不够了,需要进行磁盘排序时,就会变得很慢。...但其实像例子中那些案例,都是无法利用索引排序。曾经在mongo索引篇介绍联合索引如何创建时也提到过。...总结一下,造成数据库服务问题主要根由是 查询没有利用到索引排序 索引过滤后下面数据仍然有很多,需要扫描排序数据很多 请求并发量很高,数据库IOPS使用率高,内存占用高。

    92420
    领券