【问题标题】:How can I solve the MongoDB Overflow sort stage error?如何解决 MongoDB 溢出排序阶段错误?
【发布时间】:2015-04-03 21:29:57
【问题描述】:

我在 Windows 7(64 位)中使用 MongoDB 2.6.7 和 MongoDB C# Driver 1.10.0,我遇到以下错误:

MongoDB.Driver.MongoQueryException:QueryFailure 标志是 getMore 运行错误:溢出排序阶段缓冲数据使用 33554527 字节超过内部限制 33554432 字节(响应为 {“$err”:“getMore 运行错误:溢出排序阶段缓冲数据33554527 字节的使用超过了 33554432 字节的内部限制”,“代码”:17406 })。

我在 C# 中运行的查询是:

var query = Query<User>.EQ(c => c.GroupId, groupId);

return Collection.Find(query)
                 .SetSortOrder(SortBy.Ascending(User.ID))
                 .SetSkip(page * records)
                 .SetLimit(records)
                 .ToList();

我为 GroupId 属性使用单个索引,并且 ID(具有 _id 值)属性具有默认索引。

我看到MongoDB中有一个相关的bug:

https://jira.mongodb.org/browse/SERVER-14174

我该如何解决这个错误?

【问题讨论】:

  • 您强调的服务器问题并不真正相关。您遇到的错误表明in-memory sort 的数据过多 (>32Mb)。添加适当的索引应该可以解决此问题。看起来您的用户集合应该在 { groupId:1, _id:1} 上有一个复合索引。
  • 抱歉,我使用了逆序的组合键:{ _id:1, groupid:1},但没有成功。我按照您的顺序完成了 { groupId:1, _id:1} 并且成功了!谢谢。

标签: c# mongodb overflow mongodb-query


【解决方案1】:

您强调的服务器问题并不真正相关。您遇到的错误表明内存中排序的数据过多 (>32Mb)。添加适当的索引应该可以解决此问题。看起来您的用户集合应该在 { groupId:1, _id:1} 上有一个复合索引。

复合键中的顺序绝对重要。有关一些有用的背景阅读,请参阅:Optimizing MongoDB Compound Indexes

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 2016-01-15
    • 2017-01-10
    • 2020-01-11
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    相关资源
    最近更新 更多