sql >> データベース >  >> NoSQL >> MongoDB

MongoMapReduceの初回

    わかりました、私は考えている何かを思いついた あなたが望むことをするかもしれません。私はあなたのスキーマを100%確信していないので、これは正確には機能しないかもしれないことに注意してください(あなたの例がreferを示していることを考えると タイプaで利用できますが、bでは利用できません(それが省略であるかどうか、またはリファラーで表示したいことを考慮しているかどうかはわかりません)...とにかく、これが私が思いついたものです:

    マップ機能:

    function() {
        var obj = {
            "types": {},
            "tags": {},
        }
        obj.types[this.type] = 1;
        if (this.tags) {
            for (var tag in this.tags) {
                obj.tags[this.tags[tag]] = 1;
            }
        }
        emit(this.refer.url, obj);
    }
    

    削減機能:

    function(key, values) {
        var obj = {
            "types": {},
            "tags": {},
        }
        for (var i = 0; i < values.length; i++) {
            for (var type in values[i].types) {
                if (!type in obj.types) {
                    obj.types[type] = 0;
                }
                obj.types[type] += values[i].types[type];
            }
            for (var tag in values[i].tags) {
                if (!tag in obj.tags) {
                    obj.tags[tag] = 0;
                }
                obj.tags[tag] += values[i].tags[tag];
            }
        }
        return obj;
    }
    

    つまり、基本的に、それがどのように機能するかはこれです。 Map関数はrefer.urlのキーを使用します(あなたの説明に基づいて私が推測したもの)。したがって、最終結果は_idの配列のようになります。 refer.urlに等しい(URLに基​​づいてグループ化されます)。次に、その下に2つのオブジェクト(タイプとタグ)を持つオブジェクトを作成します。オブジェクトの理由は、mapとreduceが同じフォーマットのオブジェクトを出力できるようにするためです。それ以外は、比較的自明だと思います(わからない場合はもっと説明してみます)...

    それでは、これをPHPで実装しましょう($mapと仮定します) および$reduce 簡潔にするために、上記が含まれている文字列です):

    $mapFunc = new MongoCode($map);
    $reduceFunc = new MongoCode($reduce);
    $query = array(
        'time' => array('$gte' => time() - (60*60*60*24*30)),
        'refer.external' => true
    );
    $collection = 'visits';
    $command = array(
        'mapreduce' => $collection,
        'map' => $mapFunc,
        'reduce' => $reduceFunc,
        'query' => $query,
    );
    
    $statsInfo = $db->command($command);
    
    $statsCollection = $db->selectCollection($sales['result']);
    
    $stats = $statsCollection->find();
    
    foreach ($stats as $stat) {
        echo $stats['_id'] .' Visited ';
        foreach ($stats['value']['types'] as $type => $times) {
            echo "Type $type $times Times, ";
        }
        foreach ($stats['value']['tags'] as $tag => $times) {
            echo "Tag $tag $times Times, ";
        }
        echo "\n";
    }
    

    注意してください、私はこれをテストしていません。これは、スキーマの理解と、MongoとそのMap-Reduceの実装の理解に基づいて私が思いついたものです...



    1. mongoDBシェルを実行するJavaScriptエンジンとは何ですか?

    2. FindAndUpdateドキュメントが本当に更新されたかどうかを確認する方法

    3. node、expressjsのelasticsearchでマングースからインデックスを作成する方法

    4. ARMテンプレート出力を介してRedisprimaryKeyを返す方法は?