我有两个例子:
results = coll.group( key={"ip": 1, "id" : 1 }, condition= {}, initial={},
reduce="function(obj,prev) {}" )
print len(results)
和
map = Code(
"function () {"
"emit({ id: this.id, ip: this.ip}, {count: 1});"
"}"
)
reduce = Code("function (key, values) {""}")
result = coll.map_reduce(map, reduce, "map_reduce_example")
print result.count()
为什么第二个例子比第一个慢?我想使用2个示例而不是1个示例,因为1个示例不适用于超过20000个uniq密钥。
答案 0 :(得分:3)
MongoDB的new aggregation framework可能会解决您的问题,但在此之前我建议将map / reduce作为定期安排的后台作业运行,并实时查询map / reduce产生的集合 。这样可以更快地获得分组计数结果,但计数可能会略微过时(取决于上次背景地图缩小的时间。)
<强> 说明: 强>
MongoDB的map / reduce比group()慢得多,原因如下:
MongoDB的本机C聚合功能要快得多,但其中一个限制是所有输出必须适合单个BSON文档(目前为16MB)。这就是为什么数量有限制的原因独特的钥匙。
MongoDB的聚合框架将结合两种方法的优点:
该框架已经documented和available in development versions of MongoDB。该框架计划于2012年2月发布。
答案 1 :(得分:1)
当你运行map / reduce时,你的map
和reduce
函数在javascript运行时执行(比本机C ++代码慢)。这也涉及一些锁定(JS锁,读锁,写锁)。
group
可能会更有效地执行(更多的本机代码,更少的锁等)。
请注意,在分片环境中,map / reduce是您现在唯一的选择(在将来的版本中,您将能够使用聚合框架)。