如何使用多个键有效地执行“distinct”?

时间:2012-08-15 17:02:50

标签: mongodb

例如,有一个这样的集合:

  

{market:'SH',代码:'000001',日期:'2012-01-01',价格:1000}
  {market:'SZ',代码:'000001',日期:'2012-01-01',价格:1000}
  {market:'SH',代码:'000001',日期:'2012-01-02',价格:1000}
  {market:'SZ',代码:'000001',日期:'2012-01-02',价格:1000}
  {market:'SH',代码:'000002',日期:'2012-01-03',价格:1000}
  ...

此集合包含数千万份文档。

我想用两个键叫做distinct:

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

得到结果:

  

[{market:'SH',代码:'000001'},   {market:'SZ',代码:'000001'},   {market:'SH',代码:'000002'}]

由于本机distinct命令只接受一个键,我尝试使用map-reduce实现它。但是map-reduce太慢而不是原生的。在我的一键独特测试中,map-reduce花费的时间比原生的不同大十倍 有没有一种有效的方法来实现多键不同?

1 个答案:

答案 0 :(得分:82)

如果您愿意等待即将发布的MongoDB 2.2版本,您可以使用聚合框架有效地运行此查询:

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

在我的测试机器上的一个百万条记录集合中,这在4秒内运行,而map / reduce版本需要花费一分钟。