比如有这样一个集合:
{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 分钟的时间间隔对结果进行分组