mongodb的internalQueryExecMaxBlockingSortBytes異常修復

mongodb的internalQueryExecMaxBlockingSortBytes異常修復

96 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

相關文章
相關標籤/搜索