专栏首页运维经验分享mongodb的internalQueryExecMaxBlockingSortBytes异常修复

mongodb的internalQueryExecMaxBlockingSortBytes异常修复

mongodb的internalQueryExecMaxBlockingSortBytes异常修复

现象

node执行的服务出现异常,查看日志发现如下错误。

MongoError: QueryFailure flag set on getmore command
    at Object.toError (e:\code\api\mobile\nodejs\node_modules\mongodb\lib\mongodb\utils.js:114:11)
    at e:\code\api\mobile\nodejs\node_modules\mongodb\lib\mongodb\cursor.js:854:31
    at e:\code\api\mobile\nodejs\node_modules\mongodb\lib\mongodb\db.js:1905:9
    at Server.Base._callHandler (e:\code\api\mobile\nodejs\node_modules\mongodb\lib\mongodb\connection\base.js:453:41)
    at e:\code\api\mobile\nodejs\node_modules\mongodb\lib\mongodb\connection\server.js:488:18
    at MongoReply.parseBody (e:\code\api\mobile\nodejs\node_modules\mongodb\lib\mongodb\responses\mongo_reply.js:68:5)
    at .<anonymous> (e:\code\api\mobile\nodejs\node_modules\mongodb\lib\mongodb\connection\server.js:446:20)
    at emitOne (events.js:96:13)
    at emit (events.js:188:7)

查询该错误,未找到具体原因。然后在mongodb\cursor.js 854行,增加打印result。得到具体错误信息如下: Overflow sort stage buffered data usage exceeds in internal limit mongo执行sort语句时,内存最大32M,如果数据量大,超过这个限制就出抛出异常。

解决办法

1、给sort语句中的字段建立索引。 比如: sort({ endDate: -1, createTime: -1}) 建立索引如下:db.activity.createIndex({ endDate: -1, createTime: -1}) 。其中acitivity是集合名

2、增加内存限制 需要在admin数据库下role为root的账户下设置,例如设置成100M

use admin
db.auth("adminuser","passwd")
db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes: 104857600})

综合查询性能和服务器资源占用,推荐使用建立索引的方式。

其他需要注意的地方

除了sort, aggregate也存在内存限制,这是需要使用allowDiskUse参数,允许使用硬盘缓存中间数据。具体设置如下

db.activity.aggregate(
        [{ $unwind: '$applyment' },
        { $match: { 'applyment.items.value': req.query.uid }},
        { $project : {id:1,title: 1, 'applyment.approve': 1,'applyment.createTime': 1, endDate: 1}},
        { $sort:{ 'applyment.createTime': -1 }},
        { $skip:(result.pageNumber - 1) * result.pageSize},
        { $limit:result.pageSize}],
        { allowDiskUse: true})

关于设置索引

1、mongoDB 3.0开始ensureIndex被废弃,今后都仅仅是db.collection.createIndex的一个别名。 2、子对象的属性设置索引db.activity.createIndex({ "applyment.createTime": -1}) 3、数组内置顶位置设置索引db.activity.createIndex({ "applyment.items.0.value": 1})

对您有帮助就打赏点:)

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MongoDB3.6集群搭建(分片+副本集) 原

    分片则指为处理大量数据,将数据分开存储,不同服务器保存不同的数据,它们的数据总和即为整个数据集。追求的是高性能。 在生产环境中,通常是这两种技术结合使用,分片...

    拓荒者
  • mongodb执行js脚本(一)---shell执行

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q383965374/article/details/464...

    拓荒者
  • Centos7.4+Mongodb安装教程

    拓荒者
  • angular导入JQuery报错jquery_1.default is not a function

    引入Jquery没有问题。$使用也没有报错。 但是在浏览器执行的时候报错如下:jquery_1.default is not a function

    Bobby
  • Next.js入门教程 原

    参考代码:https://github.com/chkui/nextjs-getting-started 。

    随风溜达的向日葵
  • IDEA 取消参数名称(形参名)提示

    IDEA 会自动显示形式参数的变量名称,这在一开始使用时感觉很方便、友好。有时候也会显得排版很乱,下面是取消自动显示形式参数名称的方法:

    黑泽君
  • D-News周播报|微软高管解读第一季度财报 Tesla官方称将推拼车服务

    大数据文摘
  • .NET Core 小程序开发零基础系列(2)——小程序服务通知(模板消息)

    基于上一篇文件“.NET Core 小程序开发零基础系列(1)——开发者启用并校验牵手成功”的反映,个人觉得效果很不错,大家对公众号开发还是有很大需求的,同时也...

    hailang2zh
  • Handsontable Dropdown with key-value pair

    hbbliyong
  • mock.js生成随机数据

    然后运行:json-server data.js -p 3000 成功后地址栏打开localhost:3000你就会发现有1000条user数据

    RtyXmd

扫码关注云+社区

领取腾讯云代金券