2016-11-09 53 views
1

我使用的是Mongoose,Mongoose-paginate和ExpressJS。我有這樣的錯誤:Mongoose-paginate:溢出排序階段緩衝數據使用情況?

Error retrieving streams: MongoError: Runner error: Overflow sort stage buffered data usage of 34227161 bytes exceeds internal limit of 33554432 bytes

routes.js:

router.get("/", function(req, res, next) { 

    var page = req.query.page === undefined ? 1 : req.query.page; 
    var options = { 
     page: page, 
     limit: 30, 
     sort: { 
      created_at: 'desc' 
     } 
    }; 

    // https://github.com/edwardhotchkiss/mongoose-paginate 
    Stream.paginate(query, options, function(err, result) { 
     if (err) { 
      console.log("Error retrieving streams: " + err); 
      errorMessage = "A problem occurred retrieving the streams"; 
      return res.render("streams", { 
       streams: {}, 
       errorMessage: errorMessage 
      }); 
     } 

     return res.render("streams/list", { 
      streams: result.docs, 
      page: parseInt(result.page), 
      pages: parseInt(result.pages) 
     }); 
    }); 
}); 

我該如何解決這個貓鼬數據限制問題?

編輯:

在此之後answer,我覺得在data領域的規模過於龐大,所以我怎麼能指數data場?

這是我的模型:

model.js: 

var mongoose = require("mongoose"); 
var mongoosePaginate = require('mongoose-paginate'); 

// Declare schema 
var streamSchema = new mongoose.Schema({ 
    user_id: { 
     type: String, 
     required: true 
    }, 
    title: { 
     type: String, 
     required: true 
    }, 
    description: { 
     type: String, 
     required: true 
    }, 
    hidden:{ 
     type: String 
    }, 
    data: { 
     type: Object 
    } 
}); 

streamSchema.plugin(mongoosePaginate); 

// Export schema 
// Model.paginate() 
mongoose.model("Stream", streamSchema); 

我可以忽略data場時,我查詢流的名單?

編輯2:

有了這個解決方案:

db.mydb.ensureIndex({created_at: 1}) 
{ 
    "createdCollectionAutomatically" : true, 
    "numIndexesBefore" : 1, 
    "numIndexesAfter" : 2, 
    "ok" : 1 
} 

我仍然得到同樣的錯誤...

編輯3:

找到了答案,排除字段:

var options = { 
    page: page, 
    limit: 30, 
    sort: { 
     created_at: 'desc' 
    }, 
    select: '-data' 
}; 

我仍然得到同樣的錯誤...

+1

在這裏看到: HTTP: //stackoverflow.com/questions/27023622/overflow-sort-stage-buffered-data-usage-exceeds-internal-limit 您可以嘗試索引created_at字段。 – dyouberg

+0

@dyouberg我已經看到了答案,但我怎樣才能'索引排序字段'? – laukok

回答

2

您正在運行到內存中排序的32 MB的限制。

您想創建一個索引,以便MongoDB爲您排序。

運行在你的MongoDB程序中運行以下命令:

db.collectionName.ensureIndex({created_at: 1}) 

在這裏看到更多的信息: Overflow sort stage buffered data usage exceeds internal limit

編輯:伸出你的迴應,你做如下字段:

db.collection.find({}, {field_to_see: 1, field_to_hide: 0}) 

這裏閱讀:MongoDB Explicit Exclusion

+0

如何查詢流時忽略字段?請參閱我上面的編輯。謝謝。 – laukok

+0

'db.collectionName.ensureIndex({created_at:1})'這是幹什麼的? – laukok

+0

它告訴MongoDB通過該字段對集合進行排序,以便它可以更快地查詢數據,並儘可能避免在內存中進行排序。 – dyouberg

-1

使用光標流,用於大數據集DATAS:

var findCursor = Stream.find(query).cursor(); 
findCursor.on("data", function(data) { 
    // datas... 
}); 
findCursor.on("end", function(){ 
// end of the stream 
}); 
+0

當我查詢流時,怎麼可以忽略一個字段?請看我上面的編輯。謝謝。 – laukok

+0

忽略字段,使用項目字段: Stream .find(query,{data:0})請參閱https://docs.mongodb.com/v3.2/tutorial/project-fields-from-qu ery-results/ – Dafuck

+0

謝謝。看我的編輯3。 – laukok

0

問題解決了 - 必須添加index: 1到模型:

var mongoose = require("mongoose"); 
var mongoosePaginate = require('mongoose-paginate'); 

// Declare schema 
var streamSchema = new mongoose.Schema({ 
    title: { 
     type: String, 
     required: true 
    }, 
    description: { 
     type: String, 
     required: true 
    }, 
    hidden:{ 
     type: String 
    }, 
    data: { 
     type: Object 
    }, 
    created_at: { 
     type: Date, 
     default: Date.now, 
     index: 1 
    }, 
}); 

streamSchema.plugin(mongoosePaginate); 

// Export schema 
// Model.paginate() 
mongoose.model("Stream", streamSchema); 

然後:

mongo> db.mydb.ensureIndex({created_at: 1})