mongodb的internalQueryExecMaxBlockingSortBytes异常修复

来源:互联网 发布:淘宝直播下载什么软件 编辑:程序博客网 时间:2024/05/22 06:22

现象

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 admindb.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})

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 娱乐之 娱乐猛回头 娱乐软件 轻娱乐 娱乐项目 娱乐图片 娱乐中文 娱乐中文网 娱乐厅 娱乐方式 娱乐室 儿童娱乐房 娱乐会馆 娱乐设备 豚首娱乐 逍遥娱乐 娱乐星空 名豪娱乐 济南娱乐 悦凯娱乐 ktv娱乐项目 娱乐能成神 奇娱乐 娱乐信息 娱乐节目 娱加娱乐 娱乐大 大家玩娱乐 娱乐生活 青岛娱乐 附近娱乐 新宝5娱乐 娱乐器材 娱乐综艺 娱乐系统 娱乐圈热搜 娱乐没有圈 娱乐机 娱乐了 什么娱乐 娱乐风洞