性能Mongodb java驱动程序

时间:2015-09-01 11:18:58

标签: java mongodb

我在我的项目中使用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差很多。

1 个答案:

答案 0 :(得分:0)

我认为问题是当你在mongo shell中运行查询时,它一次只返回前20个结果,在这里你试图读取所有文档并将其放入数组

尝试此查询并查看

列出messageList = collection.find(filter).sort(... field).limit(20).into(new ArrayList());

强烈建议在查询字段上创建索引。