MongoDB Aggregation Framework的性能测试 - xbwen/xbwen.github.io GitHub Wiki

最近的项目中,需要在mongoDB的一个Collection中存储1亿多条数据,然后进行聚合统计操作。因此,做了个实验来测试MongoDB Aggregation Framework的性能。

1、数据模型

Docuemnt数据模型如下:

@Entity(name="mock")
@EnsureIndex("{name:1}, {level:1}")
public class MockEntity extends SimpleEntity {
    
    @Id
    private String id;
    private String name;
    private int level;

    //getter and setter...

}

2、插入数据

插入10组数据,每组1千万条:

AdvancedDao<MockEntity> dao = new AdvancedDao<MockEntity>(MockEntity.class);
dao.setWriteConcern(WriteConcern.UNACKNOWLEDGED);
        
for(char c='A'; c<='J'; c++){
    for(int i=0; i<10000000; i++){
        MockEntity mock = new MockEntity();
        mock.setName("" + c + "-" + i);
        mock.setLevel(new Random().nextInt(100));
        dao.save(mock);
    }
}

3、聚合统计

聚合查询最后面100万条数据的平均值,看看消耗了多少时间:

long start = System.currentTimeMillis();
        
AdvancedDao<MockEntity> dao = new AdvancedDao<MockEntity>(MockEntity.class);
DBObject match = dao.query().greaterThanEquals("name", "J-9000000").getCondition();
DBObject group = new BasicDBObject();
group.put("_id", null);
group.put("average", new BasicDBObject("$avg", "$level"));
Iterable<DBObject> results = dao.aggreage().match(match).group(group).results();
for(DBObject dbo : results){
    System.out.println(dbo.get("average"));
}
        
long end = System.currentTimeMillis();
        
System.out.println("use time: " + (end - start));

在我的MacBookPro电脑上执行上述代码,输出的结果是:2563ms。

4、结论

MongoDB Aggregation Framework的性能还是非常不错的,在笔记本上执行只花了2.5秒的时间,在服务器上能运行的更快,完全满足我们项目的要求。

有几个地方需要注意:

(1)记得建索引;

(2)Aggregate的时候,记得先用match、limit、skip等缩小数据量,再进行聚合操作。

⚠️ **GitHub.com Fallback** ⚠️