2017-03-24 15 views
0

が含まれている別のドキュメントを生成するために、あなたがたMapReduceと、すべての文書は、Twitterからのつぶやきで、あなたがしたいDBを持っていると仮定します。含まれる単語のあらゆる国 MapReduce:マップ関数の集計?

  • 一覧に公開ツイートの

    • 数それらのつぶやきには、その単語のヒット数を数えるカウンタがあります。これは、すべての国のためにも。

    私の質問:map関数の単語を集計してカウントしてから、もう一度reduce関数を実行しても問題ありませんか?このようにすると、マップ関数の出力は単一のツイートの情報を表し、reduce関数は同じ国の複数のツイートの情報を集約しますが、これが良い練習であるかどうかは分かりませんMapReduceアルゴリズム...

    ありがとうございます!

  • 答えて

    0

    mongoDB 3.4では、このプロセスを集約フレームワークで実行できます。

    最初の箇条書きについては、国のフィールドで$ group演算子を使用し、つぶやきを数えてください。

    ツイートテキストのフィールドで$ split(3.4の新機能)演算子を使用し、生成された配列で$ unwindを使用し、最後に$ groupを_idまたはcountry + wordとして使用する必要があります_idとして

    古いバージョンのmongodbを使用している場合は、map-reduceプロシージャを使用する必要がありますが、集約フレームワークはmongodbのmap-reduceよりもはるかに高速です。

    $スプリット:https://docs.mongodb.com/manual/reference/operator/aggregation/split/#exp._S_split

    $くつろぐ:https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/

    $グループ:https://docs.mongodb.com/manual/reference/operator/aggregation/group/

    0

    ビルモイサイムことによって、上記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" 
           } 
          } 
         } 
        } 
    ])