我在我的项目中使用mongodb java驱动程序对一个大集合(500万个文档)执行查询(查找,聚合,mapreduce,...)
驱动程序版本为:
<!-- MongoDB driver-->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.0.3</version>
</dependency>
我的问题是当我使用api find和java中的一些过滤器时,操作需要15秒。
....
Iterable<Document> messageList = collection.find().filter(... some filters).sort(... fields);
// Find documents
for (Document message : messageList) {
....
// some code
....
}
我检查mongo服务器日志文件并看到跟踪是 COMMAND 而不是 QUERY :
2015-09-01T12:11:47.496 + 0200 I COMMAND [conn503]命令b。$ cmd命令:count {count:&#34; logs&#34;,query:{timestamp:{$ gte:new Date (1433109600000)},aplicacion:&#34; APP1&#34;,事件:&#34;事件1&#34; planSummary:IXSCAN {timestamp:1,aplicacion:1} keyUpdates:0 writeConflicts:0 numYields:19089 reslen:44 locks:{Global:{acquireCount:{r:19090}},MMAPV1Journal:{acquireCount:{r:19090数据库:{acquireCount:{r:19090}},集合:{acquireCount:{R:19090}}} 14297ms
如果我从mongodb客户端(Robomongo)运行相同的查询,则需要0.05毫秒。
db.getCollection('logs').find({ timestamp: { $gte: new Date(1427839200000) }, aplicacion: "APP1", event: "Event1" })
并且在服务器日志中为 QUERY
使用驱动程序java命令进行的所有查询(查找,聚合,...)都会被转换?性能比mongo shell差很多。
答案 0 :(得分:0)
我认为问题是当你在mongo shell中运行查询时,它一次只返回前20个结果,在这里你试图读取所有文档并将其放入数组
尝试此查询并查看
列出messageList = collection.find(filter).sort(... field).limit(20).into(new ArrayList());
强烈建议在查询字段上创建索引。