假设您有一个数据库,其中每个文档都是来自Twitter的推文,并且您希望使用MapReduce生成包含以下内容的另一个文档:
我的问题:在地图函数上聚合和计算单词,然后在reduce函数上再次计算是否可以?这样做,map函数的输出表示单个推文的信息,reduce函数汇总来自同一个国家的几条推文的信息,但我不知道这是不是一个好的做法使用MapReduce算法...
提前谢谢!
答案 0 :(得分:0)
在mongoDB 3.4中,您可以使用聚合框架执行此过程。
对于第一个项目符号,您只需在国家/地区字段中使用$ group运算符并计算推文。
对于第二个项目符号,你必须在推文文本的字段中使用$ split(3.4中的new)运算符,然后在生成的数组中使用$ unwind,最后使用$ group作为_id或country + word作为_id _id。
如果你有一个旧版本的mongodb,那么你必须使用map-reduce程序,但是,请记住,聚合框架比mongodb上的map-reduce快得多。
$ split:https://docs.mongodb.com/manual/reference/operator/aggregation/split/#exp._S_split
$ unwind:https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/
$ group:https://docs.mongodb.com/manual/reference/operator/aggregation/group/
答案 1 :(得分:0)
从Moi Syme上面的great answer构建,理想情况下,您将运行以下聚合操作以获得所需的结果:
db.tweets.aggregate([
{ "$project": { "wordList": { "$split": [ "$text", " " ] }, "user.country": 1 } },
{ "$unwind": "$wordList" },
{
"$group": {
"_id": {
"country": "$user.country",
"word": "$wordList"
},
"count": { "$sum": 1 }
}
},
{
"$group": {
"_id": "$_id.country",
"numberOfTweets": { "$sum": 1 },
"counts": {
"$push": {
"word": "$_id.word",
"count": "$count"
}
}
}
}
])