belllee 关注node
2019.01.17 10:30 字数 343 阅读 257评论 0喜欢 1mongodb
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,若是数据量大,超过这个限制就出抛出异常。api
一、给sort语句中的字段创建索引。
好比: sort({ endDate: -1, createTime: -1})
创建索引以下:db.activity.createIndex({ endDate: -1, createTime: -1}) 。其中acitivity是集合名数组
二、增长内存限制
须要在admin数据库下role为root的帐户下设置,例如设置成100M缓存
use admin db.auth("adminuser","passwd") db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes: 104857600})
综合查询性能和服务器资源占用,推荐使用创建索引的方式。服务器
除了sort, aggregate也存在内存限制,这是须要使用allowDiskUse参数,容许使用硬盘缓存中间数据。具体设置以下app
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})
一、mongoDB 3.0开始ensureIndex被废弃,从此都仅仅是db.collection.createIndex的一个别名。
二、子对象的属性设置索引db.activity.createIndex({ "applyment.createTime": -1})
三、数组内置顶位置设置索引db.activity.createIndex({ "applyment.items.0.value": 1})性能
对您有帮助就打赏点:)ui