java - 性能 Mongodb java 驱动程序

标签 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] command b.$cmd command: count { count: "logs", query: { timestamp: { $gte: new Date(1433109600000) }, aplicacion: "APP1", event: "Event1" } } planSummary: IXSCAN { timestamp: 1, aplicacion: 1 } keyUpdates:0 writeConflicts:0 numYields:19089 reslen:44 locks:{ Global: { acquireCount: { r: 19090 } }, MMAPV1Journal: { acquireCount: { r: 19090 } }, Database: { acquireCount: { r: 19090 } }, Collection: { acquireCount: { R: 19090 } } } 14297ms

如果我从 mongodb 客户端 (Robomongo) 运行相同的查询,则需要 0.05 毫秒。

db.getCollection('logs').find({ timestamp: { $gte: new Date(1427839200000) }, aplicacion: "APP1", event: "Event1" })

并且在服务器日志中是QUERY

所有用driver java命令做的查询(find, aggregate, ...)都被转换?性能比mongo shell差很多。

最佳答案

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

试试这个查询看看

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

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

关于java - 性能 Mongodb java 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32330268/

相关文章:

mongodb - 索引一个最初在 MongoDB 中不存在的字段

java - 如何创建全局 "Intent explicitIntent = new Intent(...)"方法

java - 什么时候像这样在 Java 中使用大括号 block ?

java - 如何在浮点后保留 Double 的零

mongodb - 如何否定 MongoDB 查询?

javascript - 如何在nestjs中转换api响应?

java - 如何将字符串中的多个空格替换为单个空格(java)?

java - 我需要有一系列背景吗?

javascript - Mongo 拉入 Meteor 不拉动

javascript - Mongo 的查找操作未按预期工作