2014-02-13 57 views
1

我只是想在mongoDB中使用排序和限制,但是我得到一個parseError,只有當我輸入的限制是很大的。設定上限爲10000時使用限制和排序MongoDB parseError

handCollection = db.collection('hands'); 
handCollection.count(function(err,res){numHands=res;console.log(numHands)}) //logs 12542 

limit=10000 
query= query.sort({gameNum:-1}).limit(limit) 

query.toArray(function(er,hands){ 
    if (er) 
     throw er 
    console.log('Hands Sent:'+hands.length) 
    res.send(JSON.stringify(hands)); 
)}; 

此代碼的工作,但是當我設限= 12000,我會收到以下錯誤:

Error: parseError occured                  
    at null.<anonymous> (C:\wamp\www\poker-tell\server\node_modules\mongodb\lib\mongodb\connec 
tion\connection_pool.js:182:34)                 
    at EventEmitter.emit (events.js:98:17)              
    at Socket.<anonymous> (C:\wamp\www\poker-tell\server\node_modules\mongodb\lib\mongodb\conn 
ection\connection.js:389:20)                 
    at Socket.EventEmitter.emit (events.js:95:17)            
    at Socket.<anonymous> (_stream_readable.js:746:14)           
    at Socket.EventEmitter.emit (events.js:92:17)            
    at emitReadable_ (_stream_readable.js:408:10)            
    at emitReadable (_stream_readable.js:404:5)             
    at readableAddChunk (_stream_readable.js:165:9)            
    at Socket.Readable.push (_stream_readable.js:127:10)          

這是什麼意思和我怎麼能解決呢?

+0

您是否在字段「gameNum」上建立索引? AFAIK在mongo命令行中構建時,如果嘗試按沒有索引的字段進行排序並嘗試獲取大量記錄,則會出現錯誤。不知道nodejs是否屬於這種情況。 – yaoxing

回答

2

如果限制數量是你的查詢失敗的關鍵原因,那麼我建議你應該確定你是否在指定的排序字段上有索引(在你的情況下它是「gameNum」)。如果不是,建立索引:

db.colname.ensureIndex({gameNum: 1}) 

,你可以在這裏閱讀document about sort,它告訴你:

Note For in-memory sorts that do not use an index, the sort() operation is significantly slower. The sort() operation will abort when it uses 32 megabytes of memory.

此外,你還應該考慮@Neil倫恩的建議。

2

我會考慮確保你有最新的驅動程序作爲你做的第一件事,只是爲了確保你沒有提出可能已被解決的問題。

我看到的主要觀點是,您正在訪問大量記錄並使用toArray(),這將完全按照所說的操作並將所有文檔拉入數組中。

我會嘗試更改該呼叫以使用each()並將其推入回調中的陣列。至少這樣,如果有什麼東西導致它在特定文檔上發生變化,那麼您將更好地瞭解所發生的情況。

考慮你的用例,10,000個文檔是很多要返回到客戶端。你可能需要它,但如果有更好的方法來實現你想要的,那麼你可能不會。