Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java遍历mongodb中所有文档的性能较差_Java_Mongodb_Mongodb Java - Fatal编程技术网

使用Java遍历mongodb中所有文档的性能较差

使用Java遍历mongodb中所有文档的性能较差,java,mongodb,mongodb-java,Java,Mongodb,Mongodb Java,我将系统日志存储在mongodb中,并根据“时间”字段建立索引。现在mongodb中大约有190k个日志。 当我尝试在Java中使用DBCollection.find()方法获取所有日志时,遍历集合中的所有文档几乎要花费10秒钟。我想可能是我错过了什么导致了糟糕的表现 以下是我使用的代码: mongo = new Mongo(); DB db = mongo.getDB("Log"); DBCollection coll = db.getCollection("SystemLog"); int

我将系统日志存储在mongodb中,并根据“时间”字段建立索引。现在mongodb中大约有190k个日志。 当我尝试在Java中使用DBCollection.find()方法获取所有日志时,遍历集合中的所有文档几乎要花费10秒钟。我想可能是我错过了什么导致了糟糕的表现

以下是我使用的代码:

mongo = new Mongo();
DB db = mongo.getDB("Log");
DBCollection coll = db.getCollection("SystemLog");
int count = 0;

long findStart = Calendar.getInstance().getTimeInMillis();

// Sort by time.
BasicDBObject queryObj = new BasicDBObject();
queryObj.put("time", -1);

DBCursor cursor = coll.find().sort(queryObj);
while(cursor.hasNext()) {
    DBObject obj = cursor.next();
    // Do something
    ++count;
}
long findEnd = Calendar.getInstance().getTimeInMillis();
System.out.println("Time for traversing all system logs (" + count + "):\t" + (findEnd-findStart) + "ms.");
打印结果为:

Time for traversing all system log (194309):    10496ms.
我已经试过好几次了。似乎一次运行或多次运行没有区别。虽然我也尝试过删除sort(),只是从mongodb中查找所有注销的日志。遍历所有文档大约需要6秒钟。时间对我的要求来说还是有点不可接受。是否有任何实现技巧可以加快遍历工作


非常感谢。

您真的需要遍历所有文档吗?在上面的代码中,看起来您只是一个接一个地将每个对象带入内存

  • “时间”字段上的索引应构造为“递减”,因为您是这样排序的
  • 如果索引是复合的(索引中有更多的字段,而不仅仅是“时间”),请确保您还添加了一个带有“时间”的索引。此外,当您要向该查询添加筛选器时,请确保“时间”字段是在索引中最后添加的,并且是递减的
  • 考虑到您正在逐个读取190k个对象,性能并没有那么差
    (请注意,我使用mongodb的经验并不涉及使用Java驱动程序)

    感谢您的回复和建议。是的,我需要遍历所有文档。实际上,我需要做的是将所有日志从mongodb导出到一个文件中,因此我必须将文档一个接一个地放入内存(并将它们写入固定格式的文本文件)。但是,我希望这项工作可以在不超过5秒钟内完成,因为在生成日志文件后,用户必须再等待几秒钟才能下载日志文件。请确保时间下降的索引存在。此外,我会尝试一次获得几个k的对象。对查询进行限制和跳过(Java驱动程序应该处理这个问题),并将对象分块获取。查看mongo事件探查器,看看那里发生了什么。最好的情况是,每次都会看到一个游标,它以完全索引的方式返回大块对象。