【问题标题】:How to efficiently perform "distinct" with multiple keys?如何使用多个键有效地执行“不同”?
【发布时间】:2012-08-15 17:02:49
【问题描述】:

比如有一个这样的集合:

{市场:'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 测试中,map-reduce 花费的时间大约是原生 distinct 的十倍。
有没有一种有效的方法来实现多键不同?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      相关资源
      最近更新 更多