使用limit和sort时的MongoDB parseError

时间:2014-02-13 23:16:54

标签: node.js mongodb parsing sorting limit

我只是试图在mongoDB中使用sort和limit,但是我得到一个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));
)};

当设置限制为10000时,此代码有效,但当我设置limit = 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)                                       

这是什么意思,我该如何解决?

2 个答案:

答案 0 :(得分:2)

我会考虑确保您拥有最新的驱动程序,这是为了确保您没有找到可能已解决的问题。

我看到的主要观点是你正在访问大量记录并使用toArray(),这将完全按照说法完成,只需将所有文档拉入数组。

我会尝试更改该调用以使用each()并在回调中推送到您的数组。至少就是这样,如果有什么东西导致它在特定文档上绊倒,你就会更好地了解发生的位置。

考虑您的用例,10,000个文档可以返回给客户端。你可能需要它,但如果有更好的方法来实现你想要的东西,那么你可能不会。

答案 1 :(得分:2)

如果限制数量是您的查询失败的关键原因,那么我建议您应该确定您是否在指定的排序字段上有索引(在您的情况下,它是“gameNum”)。如果没有,建立索引:

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

你可以在这里阅读document about sort,告诉你:

  

注意对于不使用索引的内存中排序,sort()   操作明显变慢。 sort()操作将中止   当它使用32兆字节的内存时。

此外,您还应该考虑@Neil Lunn的建议。