2

我得到了大约 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 secs

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

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 secs找到最高价格。那么在我的查询中可以改进什么?我认为这样的数据库应该比在 java 中迭代游标更快,当我错了时纠正我。

4

1 回答 1

1

有许多的原因。

首先,对于您的光标示例,您只是在运行一个查询,对子文档字段上的所有根文档进行排序,很可能是索引。无论您如何看待它,这都会更快。

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

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

不仅如此,您还计划在聚合过程中进行一半,从而使 MongoDB 进一步强行拆分您的文档。

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

于 2013-03-14T10:35:00.370 回答