51

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

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

该集合包含数以千万计的文档。

我想用两个键调用 distinct:

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

并得到结果:

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

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

4

1 回答 1

107

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

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

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

于 2012-08-16T16:44:31.710 回答