Mongodb MapReduce:在map函数中聚合?

Mongodb MapReduce:在map函数中聚合?,mongodb,mapreduce,Mongodb,Mapreduce,假设您有一个数据库,其中每个文档都是来自Twitter的tweet,并且您希望使用MapReduce生成另一个包含以下内容的文档: 每个国家发布的推文数量 这些推文中包含的单词列表,以及计算该单词总点击量的计数器。这也适用于每个国家 我的问题是:在map函数中对单词进行聚合和计数,然后再在reduce函数中对单词进行聚合和计数可以吗?这样做,map函数的输出表示单个tweet的信息,reduce函数聚合来自同一国家的多条tweet的信息,但我不知道这是否是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"
                }
            }
        }
    }
])