mongodb - 如何使用多个键有效地执行 "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 来实现它。但是 map-reduce 对原生 distinct 来说太慢了。在我的一键 distinct 测试中,map-reduce 花费的时间大约是原生 distinct 的十倍。
有没有一种有效的方法来实现多键区分?

最佳答案

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

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

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

关于mongodb - 如何使用多个键有效地执行 "distinct"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11973725/

相关文章:

mongodb - 选择 MongoDb/CouchDb/RavenDb - 性能和可扩展性建议

mongodb - 如何使用 mongodb 更新包含在父对象数组中的对象的属性?

node.js - Redis 缓存和 Mongo 的持久性架构

javascript - Meteor 文档中的消息计数示例如何工作?

mongodb - 如何对 MongoDB 集合中所有文档的键值求和

mongodb - EventStore 与 MongoDb

java - 为什么 Casbah/Java MongoDB 驱动程序会出现 java.lang.I

mongodb - 在 MongoDb 中按 15 分钟的时间间隔对结果进行分组

mongodb - 在 MongoDB 中存储 null 与根本不存储 key

mongodb - insert()、insertOne() 和 insertMany() 方法有什