如何高效地使用多个键执行“distinct”操作?

6 浏览
0 Comments

如何高效地使用多个键执行“distinct”操作?

例如,有这样一个集合:

{market: 'SH', code: '000001', date: '2012-01-01', price: 1000}

{market: 'SZ', code: '000001', date: '2012-01-01', price: 1000}

{market: 'SH', code: '000001', date: '2012-01-02', price: 1000}

{market: 'SZ', code: '000001', date: '2012-01-02', price: 1000}

{market: 'SH', code: '000002', date: '2012-01-03',price: 1000}

...

这个集合包含着数千万条文档。

我想要使用两个键调用distinct:

collection.distinct('market', 'code');

并得到结果:

[{market: 'SH', code:'000001'},

{market: 'SZ', code:'000001'},

{market: 'SH', code:'000002'}]

由于原生的distinct命令只接受一个键,我尝试使用map-reduce来实现它。但是相比原生的distinct,map-reduce的速度要慢得多。在我的一键distinct测试中,map-reduce的执行时间大约是原生distinct的十倍。

有没有一种高效的方法来实现多键distinct?

0
0 Comments

问题出现的原因是在MongoDB中执行"distinct"操作时,使用多个键(market和code)进行分组聚合时效率较低。为了解决这个问题,可以在即将发布的2.2版本中使用聚合框架来高效地执行这个查询。

在聚合框架中,可以使用以下代码来执行查询:

collection = db.tb;
result = collection.aggregate( 
            [
                {"$group": { "_id": { market: "$market", code: "$code" } } }
            ]
        );
printjson(result);

在我的测试机器上,对于一个包含一百万条记录的集合,使用这个聚合框架的查询只需要4秒,而使用map/reduce方法则需要超过一分钟。

0