【发布时间】:2012-12-12 17:59:47
【问题描述】:
我刚开始使用 mongo db 并尝试做一些简单的事情。我用包含“item”属性的数据集合填充了我的数据库。我想尝试计算每个项目在集合中的时间
文档示例:
{ "_id" : ObjectId("50dadc38bbd7591082d920f0"), "item" : "Pons", "lines" : 37 }
所以我设计了这两个函数来做 MapReduce(使用 pymongo 用 python 编写)
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 吹嘘速度,我想我一定是做错了某些事情!
Stack Overflow 上的一个问题让我查看了 mongodb 的聚合功能。所以我尝试使用 group + sum + sort thingies。想出了这个:
db.wikipedia.aggregate(
{ $group: { _id: "$item", count: { $sum: 1 } } },
{ $sort: {count: 1} }
)
这段代码工作得很好,给我的结果与 mapreduce 集相同,但它同样慢。难道我做错了什么?我真的需要使用 hadoop 等其他工具来获得更好的性能吗?
【问题讨论】:
-
$group 无法使用索引,然后您正在对计算字段进行全表扫描和排序,该计算字段再次无法使用索引...嗯,是的,我认为这很容易变得很慢和 MR ,请查看 $sort 上的注意事项:docs.mongodb.org/manual/reference/aggregation/#_S_sort。老实说,我不认为这是工具的错,而是更多的模式设计,如果你需要在实时的时间内进行这样的查询
-
阅读此内容以获得澄清:stackoverflow.com/questions/12015064/…
-
@Sammaye 当您阅读我的结束语时,您会注意到我并没有对这些工具大发雷霆。我还没有使用 NoSQL 和 MongoDB 的经验。我只是问有什么问题。我如何改进我的设计以使这件事以正确的方式运行。
-
我并没有责备你的愤怒:) 我是在说明我认为问题出在哪里。嗯,一个额外的预聚合集合是一个很好的起点,所以每次添加
item时,您都会将该行(可能在您的应用程序中)ping 到另一个集合,它将使用$inc运算符更新此数据。这可能是最好的方法,无需过多阅读。当然,这确实意味着您要管理两个集合,但管理它们会比您进行查询更快、更容易。 -
@Sammaye 好吧,老实说,我发现您的反馈非常有建设性,所以我只是想确定一下;)我也在考虑为此提供两个集合解决方案。它在 NoSQL 故事中更有意义,然后尝试创建更复杂的查询。非常感谢您指出对计算字段进行排序确实有点慢:)
标签: mongodb mapreduce pymongo nosql