【问题标题】:MongoDB parseError when using limit and sort使用限制和排序时的MongoDB parseError
【发布时间】:2014-02-13 23:16:54
【问题描述】:

我只是想在 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));
)};

此代码在将limit设置为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)                                       

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

【问题讨论】:

  • 您是否在“gameNum”字段上建立了索引?当您尝试按没有索引的字段进行排序并尝试获取大量记录时,在 mongo 命令行中的构建中的 AFAIK 会出现错误。不知道nodejs中是不是这样。

标签: node.js mongodb parsing sorting limit


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    我会首先确保您拥有最新的驱动程序,以确保您没有遇到可能已经解决的问题。

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

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

    再考虑一下您的用例,10,000 个文档要返回给客户是非常多的。你可能需要它,但如果有更好的方法来实现你想要的,你可能就不需要了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-13
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多