我只是试图在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)
这是什么意思,我该如何解决?
答案 0 :(得分:2)
我会考虑确保您拥有最新的驱动程序,这是为了确保您没有找到可能已解决的问题。
我看到的主要观点是你正在访问大量记录并使用toArray(),这将完全按照说法完成,只需将所有文档拉入数组。
我会尝试更改该调用以使用each()并在回调中推送到您的数组。至少就是这样,如果有什么东西导致它在特定文档上绊倒,你就会更好地了解发生的位置。
考虑您的用例,10,000个文档可以返回给客户端。你可能需要它,但如果有更好的方法来实现你想要的东西,那么你可能不会。
答案 1 :(得分:2)
如果限制数量是您的查询失败的关键原因,那么我建议您应该确定您是否在指定的排序字段上有索引(在您的情况下,它是“gameNum”)。如果没有,建立索引:
db.colname.ensureIndex({gameNum: 1})
你可以在这里阅读document about sort,告诉你:
注意对于不使用索引的内存中排序,sort() 操作明显变慢。 sort()操作将中止 当它使用32兆字节的内存时。
此外,您还应该考虑@Neil Lunn的建议。