gpt4 book ai didi

java - 为什么聚合框架的 $max 函数比迭代游标慢?

转载 作者:可可西里 更新时间:2023-11-01 10:44:25 24 4
gpt4 key购买 nike

我得到了一个包含大约 300.000 个条目的数据集。为了存储该数据,我使用的是当前版本的 mongodb 2.2.3。我的问题是如何使用聚合框架提高搜索性能?

这是我存储的数据的一个例子:

{
"_id":"654311649875645643131564",
"@type":"K",
"dataSourceA":{
"name": "abc",
"price": 12.99
},
"dataSourceB":{
"name": "xyz"
}
}

在我切换到较新版本的 mongodb 之前,我处理了搜索,例如没有像这样的聚合框架的最大值:

searchQuery = new BasicDBObject("dataSourceA.price", -1);
DBCursor cursor = collection.find().sort(searchQuery).limit(1);

此操作大约需要 0.921 秒

现在我尝试了聚合框架来获得相同的结果,但我想更快地找到最高价格。这是我的方法:

DBObject match = new BasicDBObject("$match", new BasicDBObject("@type", "K"));
DBObject fields = new BasicDBObject("dataSourceA.price", 1);
DBObject project = new BasicDBObject("$project", fields);
DBObject groupFields = new BasicDBObject("_id", 1);
groupFields.put("max", new BasicDBObject("$max", "$dataSourceA.price"));

DBObject group = new BasicDBObject("$group", groupFields);

Iterable<DBObject> results =
collection.aggregate(match, project, group).results();

但此操作需要大约 4.837 秒 才能找到最高价格。那么我的查询可以改进什么?我认为像这样的数据库应该比在 Java 中迭代游标更快,如果我错了请纠正我。

最佳答案

这有很多原因。

首先,对于您的游标示例,您只是运行一个查询,对子文档字段上的所有根文档进行排序,很可能已建立索引。无论您怎么看,这都会更快。

第二个 $max 实际上是一个 $group 运算符,这意味着它是对适合您的查询集的所有文档(所有 300,000 个它们),因此 MongoDB 正在计算结果集中所有文档的每个文档的多值字段的最大值,按 _id 分组。

由于 $max 的工作方式,您会立即失去从索引游标中获得的即时排序能力。

不仅如此,您还在聚合的中途进行投影,使 MongoDB 进一步强制拆分您的文档。

所以不,它不应该比迭代排序的索引游标更快。

关于java - 为什么聚合框架的 $max 函数比迭代游标慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15405871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com