例如,有一个这样的集合:
{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花费的时间比原生的不同大十倍 有没有一种有效的方法来实现多键不同?
答案 0 :(得分:82)
如果您愿意等待即将发布的MongoDB 2.2版本,您可以使用聚合框架有效地运行此查询:
collection = db.tb;
result = collection.aggregate(
[
{"$group": { "_id": { market: "$market", code: "$code" } } }
]
);
printjson(result);
在我的测试机器上的一个百万条记录集合中,这在4秒内运行,而map / reduce版本需要花费一分钟。