【问题标题】:Get the max element in mongodb collection throws exception获取 mongodb 集合中的最大元素引发异常
【发布时间】:2013-03-08 21:43:24
【问题描述】:

下面的代码有问题。我尝试在“链接”集合中获取 max(seq)。运行下面的代码后,我收到“FATAL ERROR: JS Allocation failed - process out of memory”错误。我怎样才能克服这个问题?感谢您的回复。

db.collection('links', function(err, collection) {  
        var options = { "limit": 1, "sort": [['seq','desc']]};

        collection.find({}, options , function(err, docs) {            
            console.log("Returned #" + docs.seq + " documents");
        }); 
}); 

注意:顺便说一句,节点运行后内存使用量增加得惊人。

【问题讨论】:

  • 你有seq 的索引吗?如果不是,则该查询必须将您的整个集合加载到内存中。
  • 我没有索引。我尝试将 seq 值存储在另一个集合中。我猜它可能会加快执行时间。
  • 还需要注意的是,内存排序在有或没有 JS 的情况下都有限制,如果大约 32 兆。

标签: node.js mongodb


【解决方案1】:

seq 上的索引添加到您的集合中,这样Mongo 就不必将整个集合加载到内存中对其进行排序。

另外,使用findOne 而不是find,因为当前代码中的docs 参数实际上是一个游标对象,而不是最大seq 的文档。如:

var options = { "sort": [['seq','desc']] };
collection.findOne({}, options , function(err, doc) {
    console.log("Returned #" + doc.seq + " documents");
}); 

【讨论】:

  • 谢谢你,约翰尼。我将“seq”值存储在另一个集合中并克服了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 2015-11-11
  • 2015-12-07
  • 2011-06-16
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
相关资源
最近更新 更多