mongodb - "too much data for sort()"在一个小集合上

标签 mongodb mongodb-query

当尝试对 mongodb 集合进行查找和排序时,出现以下错误。该集合一点也不大 - 我只有 28 个文档,当我超过 23 条记录的限制时,我开始收到此错误。

该文档的特殊之处在于它内部包含一个大型 ArrayCollection,但我根本不获取该特定字段,我只是尝试获取 DateTime 字段。

db.ANEpisodeBreakdown.find({creationDate: {$exists:true}}, {creationDate: true} ).limit(23).sort( { creationDate: 1}

{ "$err" : "too much data for sort() with no index. add an index or specify a smaller limit", "code" : 10128 }

最佳答案

所以这里的问题是 32MB 限制,并且您没有可以用作“仅索引”或“覆盖”查询来获取结果的索引。如果没有这个,您的“大字段”仍然会加载到数据中进行排序。

易于复制;

var string = "";
for ( var n=0; n < 10000000; n++ ) {
   string += 0;
}

for ( var x=0; x < 4; x++ ) {
    db.large.insert({ "large": string, "date": new Date() });
    sleep(1000);
}

所以这个查询将会崩溃,除非你限制为 3:

db.large.find({},{ "date": 1 }).sort({ "date": -1 })

要克服这个问题:

  1. 在日期(和其他使用的字段)上创建索引,这样整个文档就不会加载到您覆盖的索引查询中:

    db.large.ensureIndex({ "date": 1 })
    db.large.find({},{ "_id": 0, "date": 1 }).sort({ "date": -1 })
    
    { "date" : ISODate("2014-07-07T10:08:33.067Z") }
    { "date" : ISODate("2014-07-07T10:08:31.747Z") }
    { "date" : ISODate("2014-07-07T10:08:30.391Z") }
    { "date" : ISODate("2014-07-07T10:08:29.038Z") }
    
  2. 不要索引并使用聚合,如 $project不会受到与文档在传递到 $sort 之前实际发生更改相同的限制。 .

    db.large.aggregate([
        { "$project": { "_id": 0, "date": 1 }},
        { "$sort": {"date": -1 }}
    ])
    
    { "date" : ISODate("2014-07-07T10:08:33.067Z") }
    { "date" : ISODate("2014-07-07T10:08:31.747Z") }
    { "date" : ISODate("2014-07-07T10:08:30.391Z") }
    { "date" : ISODate("2014-07-07T10:08:29.038Z") }
    

无论哪种方式都可以让您获得限制下的结果,而无需以任何方式修改游标限制。

关于mongodb - "too much data for sort()"在一个小集合上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24606601/

相关文章:

ruby-on-rails - 减少sidekiq作业的执行时间

mongodb - 在 upsert 期间使用 $set 和 $setOnInsert

MongoDB $and 查询单个嵌入文档中的多个字段和值

mongodb - 在 MongoDB 聚合期间拆分字符串

mongodb - 2天无法连接到远程mongo db

node.js - nodejs 中的 ORM Bookshelf + postgresql 或 MongoDB 数据库?

python - 如何使用 FastAPI + uvicorn 在工作人员之间共享数据库连接?

mongodb - 我应该保留什么 setLimit(int64) 方法来显示 Collections 中的所有记录

javascript - meteor 发布复合和嵌套集合

node.js - 在 mongodb 中使用聚合与 $group