【问题标题】:Sorting MongoDB subfield throws exception on Java排序 MongoDB 子字段在 Java 上引发异常
【发布时间】:2014-10-02 12:18:15
【问题描述】:

我正在努力解决这个问题。我的代码在cursor.hasNext(); 上抛出异常

MongoClient mongoClient = new MongoClient();
DB db = mongoClient.getDB("DBname");
DBCollection coll = db.getCollection("ColName");
DBObject orderBy = new BasicDBObject();
orderBy.put("'field.subfield1.subfield2'", -1);
DBCursor cursor = coll.find().sort(orderBy);
...
cursor.hasNext();

例外: 线程“main”com.mongodb.MongoException 中的异常:运行器错误:溢出排序阶段缓冲数据使用量 33571128 字节超出内部限制 33554432 字节

当我在数据库控制台中使用类似的查询时,它工作得很好。当我添加搜索查询时,它不会抛出异常,也不会返回任何结果。

代码有什么问题?我只需要带有排序文档的光标。

【问题讨论】:

  • 索引该字段。但真正向您展示实际的文档结构。如果这是任何形式的数组,那么它不会做你认为它可能做的事情。

标签: java mongodb sorting cursor


【解决方案1】:

一般来说,错误意味着您需要减少结果集,或使用索引等来执行排序:

如果满足以下条件,MongoDB 只会返回没有索引的字段的排序结果 排序操作中所有文档的总大小,加上一个小的 开销,小于 32 兆字节。 Sorted Documents

** 我注意到您在orderBy.put("'field.subfield1.subfield2'", -1); 中对排序进行了双引号,所以这可能是问题所在 - 没有可用的索引并且它试图对整个集合进行排序。

【讨论】:

  • 是这个问题吗?我需要的只是通过光标以特定顺序获得结果。如果我需要通过大量收集来做到这一点,真的不可能吗?我可以通过控制台做到这一点。报价真的没有什么区别。没有它,它就不能工作。
  • 如果它在控制台中工作,那么相同的查询将通过驱动程序工作。
猜你喜欢
  • 2012-07-27
  • 1970-01-01
  • 2018-01-21
  • 2019-07-05
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
相关资源
最近更新 更多