在 mongo 中,如何使用 Map Reduce 来按最近排序来获取组
我看到的 MapReduce 示例使用了诸如 count 之类的聚合函数,但是使用 MapReduce 来获取每个类别中前 3 个项目的最佳方法是什么。
我假设我也可以使用 group 函数,但很好奇,因为他们声明分片环境不能使用 group()。然而,我实际上也有兴趣查看 group() 示例。
the map reduce examples I see use aggregation functions like count, but what is the best way to get say the top 3 items in each category using map reduce.
I'm assuming I can also use the group function but was curious since they state sharded environments cannot use group(). However, I'm actually interested in seeing a group() example as well.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
为了简化起见,我假设您有以下形式的文档:
我创建了 1000 个文档,涵盖 100 个类别:
我们的映射器非常简单,只需将类别作为键发出,并发送一个包含分数数组的对象作为值:
MongoDB的reducer不能返回数组,并且reducer的输出必须与我们
发出
的值具有相同的类型,因此我们必须将其包装在一个对象中。我们需要一组分数,因为这将让我们的减速器计算前 3 个分数:最后,调用 map-reduce:
现在我们有一个集合,其中每个类别包含一个文档,以及来自
的所有文档的前 3 个分数foo
在该类别中:(如果您使用与我上面相同的
Math.random()
数据生成器,您的确切值可能会有所不同)您现在可以使用它来查询
foo
对于具有最高分数的实际文档:此代码不会处理平局,或者
更确切地说,如果存在平局,
find_top_scores
生成的最终游标中可能会返回超过 3 个文档。使用
group
的解决方案有点类似,不过reducer 一次只需考虑两个文档,而不是键的分数数组。For the sake of simplification, I'll assume you have documents of the form:
I've created 1000 documents covering 100 categories with:
Our mapper is pretty simple, just emit the category as key, and an object containing an array of scores as the value:
MongoDB's reducer cannot return an array, and the reducer's output must be of the same type as the values we
emit
, so we must wrap it in an object. We need an array of scores, as this will let our reducer compute the top 3 scores:Finally, invoke the map-reduce:
Now we have a collection containing one document per category, and the top 3 scores across all documents from
foo
in that category:(Your exact values may vary if you used the same
Math.random()
data generator as I have above)You can now use this to query
foo
for the actual documents having those top scores:}
This code won't handle ties, or rather, if ties exist, more than 3 documents might be returned in the final cursor produced by
find_top_scores
.The solution using
group
would be somewhat similar, though the reducer will only have to consider two documents at a time, rather than an array of scores for the key.