Mongodb MapReduce:在map函数中聚合?
假设您有一个数据库,其中每个文档都是来自Twitter的tweet,并且您希望使用MapReduce生成另一个包含以下内容的文档:Mongodb MapReduce:在map函数中聚合?,mongodb,mapreduce,Mongodb,Mapreduce,假设您有一个数据库,其中每个文档都是来自Twitter的tweet,并且您希望使用MapReduce生成另一个包含以下内容的文档: 每个国家发布的推文数量 这些推文中包含的单词列表,以及计算该单词总点击量的计数器。这也适用于每个国家 我的问题是:在map函数中对单词进行聚合和计数,然后再在reduce函数中对单词进行聚合和计数可以吗?这样做,map函数的输出表示单个tweet的信息,reduce函数聚合来自同一国家的多条tweet的信息,但我不知道这是否是MapReduce算法的良好实践 提
- 每个国家发布的推文数量
- 这些推文中包含的单词列表,以及计算该单词总点击量的计数器。这也适用于每个国家
提前谢谢你 在mongoDB 3.4中,您可以使用聚合框架完成此过程 对于第一个项目,您只需在country字段使用$group operator并计算推文数量 对于第二个项目符号,您必须在tweet文本的字段中使用$split(3.4中新增)操作符,然后在生成的数组中使用$unwind,最后使用$group和word作为_id或country+word作为_id 如果您有一个较旧版本的mongodb,那么您必须使用map reduce过程,但请记住,聚合框架比mongodb上的map reduce快得多 $split: $REWIND: $group:通过Moi Syme从上面构建,理想情况下,您可以运行以下聚合操作以获得所需的结果:
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"
}
}
}
}
])