我刚刚开始与mongo db并试图做一些简单的事情。我用包含“item”属性的数据集合填充了我的数据库。我想尝试计数每个项目多少时间是集合中的文档的像MapReduce一样慢的MongoDB聚合?
例如:
{ "_id" : ObjectId("50dadc38bbd7591082d920f0"), "item" : "Pons", "lines" : 37 }
所以我设计了这两个函数做的MapReduce(用Python编写的使用pymongo)
all_map = Code("function() {"
" emit(this.item, 1);"
"}")
all_reduce = Code("function (key, values) {"
" var sum = 0;"
" values.forEach(function(value){"
" sum += value;"
" });"
" return sum;"
"}")
这就像一个魅力,所以我开始填充集合。在大约30,000个文档中,mapreduce已经持续了一秒多的时间...因为NoSQL对速度吹牛我以为我一定在做东西错了!
堆栈溢出问题在这里让我看看mongodb的聚集功能。所以我尝试使用group + sum + sort thingies。想到这个:
db.wikipedia.aggregate(
{ $group: { _id: "$item", count: { $sum: 1 } } },
{ $sort: {count: 1} }
)
这段代码工作得很好,给了我mapreduce设置相同的结果,但它也一样慢。难道我做错了什么?我真的需要使用其他工具,如hadoop以获得更好的性能?
$ group不能使用索引,然后你正在进行全表扫描和排序计算字段,再次不能使用索引...嗯,是的,我认为这可能很容易如慢,先生,看看$ sort的注意事项:http://docs.mongodb.org/manual/reference/aggregation/#_S_sort。如果我是诚实的,我不认为这是工具的错误,但更多的模式设计,如果你需要做这样的实时查询 - 这需要时间 – Sammaye
阅读这个澄清:http:// stackoverflow.com/questions/12015064/mongodb-mapreduce-and-sorting –
@Sammaye当你读完我的结尾句子时,你会注意到我并没有对这些工具大发雷霆。我还没有使用NoSQL和MongoDB的经验。我只是问什么是错的。我怎样才能改进我的设计,让这件事情以正确的方式运行。 – Arninja