性能:Mongodb Java驱动程序

4

我在我的项目中使用MongoDB Java驱动程序执行查询(查找、聚合、MapReduce等)来处理一个大集合(5百万个文档)。

驱动程序版本为:

<!-- MongoDB driver-->
<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongo-java-driver</artifactId>
  <version>3.0.3</version>
</dependency>

我的问题是,当我使用Java中的API并带有一些筛选条件时,操作需要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

所有使用Java命令进行的查询(查找,聚合等)是否都被转换了?性能远不如Mongo shell。


你尝试过使用 collection.find(... some filters...).sort(... fields); 吗?这种方法不使用 MongoCursor.filter 方法,而是在打开游标时提供筛选条件。这更接近于你的 shell 查询。 - Philipp
是的,我尝试了但结果一样。 - limkin
我刚刚注意到你的shell查询中没有sort。也许这就是罪魁祸首? - Philipp
没有,它有排序子句。我没有将其设置为注释以便更清晰。 - limkin
1个回答

0

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

尝试使用以下查询:

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

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


我不这么认为。我已经使用带有限制子句的查询来进行分页,并获得了相同的结果。我知道建议创建索引。 - limkin
限制结果后,您是否仍然遇到相同的问题? - Rohit Jain
我刚刚看到,性能问题不在于查找查询。它花费的时间与Robomongo客户端相同(15毫秒)。除了这个查找之外,我还执行了一个count()查询来获取文档的总数(用于分页)。这个查询需要超过一分钟,因为有250万个文档。 - limkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接