6

統計を抽出する必要があるかなり大きなMongoDBを入手しました。これは、MapReduceクエリを実行して購入します。

問題は、コレクション全体を使用する代わりに、たとえばstatus:'drafted"を使用するようにクエリを絞り込む必要があることです。

これは私のMap/Reduceコードです(Codeigniterを使用しています):このクエリの最後の手順を実行しようとしましたが、結果が得られないため、構文を間違って追加したと思います:http: //cookbook.mongodb.org/patterns/ unique_items_map_reduce/

$map = new MongoCode ("function() {

                day = Date.UTC(this.created_at.getFullYear(), this.created_at.getMonth(), this.created_at.getDate());

                emit ({day: day, _id: this._id}, {created_at: this.created_at, count: 1});

            }");

            $reduce = new MongoCode ("function( key , values ) {

                var count = 0;

                values.forEach (function(v) {

                    count += v['count'];

                });

                return {count: count};

            }");

            $outer = $this->cimongo->command (array (

                "mapreduce" => "documents",   

                "map"       => $map,   

                "reduce"    => $reduce,  

                "out"       => "stats_results"

            ));


            $map = new MongoCode ("function() {

                emit(this['_id']['day'], {count: 1});

            }");

            $reduce = new MongoCode ("function( key , values ) {

                var count = 0;

                values.forEach (function(v) {

                    count += v['count'];

                });

                return {count: count};

            }");

            $outer = $this->cimongo->command (array (

                "mapreduce" => "stats_results",   

                "map"       => $map,   

                "reduce"    => $reduce,   

                "out"       => "stats_results_unique"

            ));
4

1 に答える 1

13

あなたの質問についての2つのこと:

1) クックブックの例は、あなたがしようとしていることに対して少し複雑すぎるかもしれません. これはより簡単なものです:

次のようなドキュメント構造があるとします。

{
    "url" : "http://example.com/page8580.html",
    "user_id" : "Jonathan.Clark",
    "date" : ISODate("2012-06-11T10:59:36.271Z")
}

個別の URL ごとの訪問数をカウントする map/reduce ジョブを実行するサンプル JavaScript コードを次に示します。

// Map function:

map = function() {
  emit({ url: this.url }, {count: 1});
}

// Reduce function:

reduce = function(key, values) {
    var count = 0;

    values.forEach(
    function(val) { count += val['count']; }
    );

    return {count: count};
};

// Run the Map/Reduce function across the 'pageviews' collection:
// Note that MongoDB will store the results in the 'pages_per_day'
//   collection because the 'out' parameter is present

 db.pageviews.mapReduce( 
    map,        // pass in the 'map' function as an argument
    reduce,     // pass in the 'reduce' function as an argument
    // options
    { out: 'pages_per_day',     // output collection
      verbose: true }       // report extra statistics
);

2) 「pageviews」コレクションのサブセットのみで Map/Reduce 関数を実行する場合は、「map( )' 関数は以下で動作します。

// Run the Map/Reduce function across the 'pageviews' collection, but 
// only report on the pages seen by "Jonathan.Clark"

 db.pageviews.mapReduce( 
    map,        // Use the same map & reduce functions as before
    reduce,     
    { out: 'pages_per_day_1user',       // output to different collection
      query:{ 'user_id': "Jonathan.Clark" }     // query descriptor
      verbose: true }       
);

JavaScript を使用していない場合は、これらの呼び出しを使用しているプログラミング言語に変換する必要があることに注意してください。

3) PHP を使用してクエリ条件で Map/Reduce 関数を呼び出す例を次に示します。

$outer = $this->cimongo->command (array (
                "mapreduce" => "pageviews",   
                "map"       => $map,   
                "reduce"    => $reduce,   
                "out"       => "pages_per_day_1user",
                "query"     => array( "user_id" => "Jonathan.Clark" )
            ));

4) Map/Reduce の詳細については、次の参考文献を参照してください。

于 2012-06-13T18:42:49.877 に答える