我在我的项目中使用 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/