当尝试对 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 })
要克服这个问题:
在日期(和其他使用的字段)上创建索引,这样整个文档就不会加载到您覆盖的索引查询中:
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") }
不要索引并使用聚合,如
$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/