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

PHPMongoDBマップがdbアサーションの失敗を減らす

    mapReduce()を使用する場合、reduce()関数の戻り値は、reduce()関数の「values」要素で取得するものと同じ形状である必要があることを覚えておくことが重要です。次に、emit()関数によって出力されるものと同じ形状である必要があります。

    次の形式のドキュメントを含むコレクションがあるとします。

    > db.posts.count();
    1000
    > db.posts.findOne();
    {
        "_id" : 0,
        "date_posted" : ISODate("2012-04-04T05:54:44.535Z"),
        "topic_id" : "sierra"
    }
    

    次のコードは、必要な出力を生成します。

    <?php
    
    $conn = new Mongo("localhost:$port");
    $db = $conn->test;
    $collection = $db->tst;
    
    $map = new MongoCode(
        "function() { emit( this.topic_id, { last_post: this.date_posted } ); }"
    );
    
    $reduce = new MongoCode(
      "function(key, values) { ".
          "var max = ISODate('1970-01-01T00:00:00Z'); ".
    
          "values.forEach(function(val) { ".
              "if ( max < val.last_post ) max = val.last_post; ".
          "}); ".
    
          "return {last_post : max}; " .
      "}"
    );
    
    
    $result = $db->command( array(
        "mapreduce" => "posts",
        "map" => $map,
        "reduce" => $reduce,
        "query" => array( "topic_id" => "alpha"), 
        "out" => array( "merge" => "lastPosts")
        )
    );
    echo "result: "; print_r($result);
    
    $collection = $db->lastPosts;
    $cursor = $collection->find()->limit(6);
    
    date_default_timezone_set("UTC");
    foreach( $cursor as $doc ) {
        $date = date( "r", $doc['value']['last_post']->sec );
        echo $doc['_id'] . " last visited at " . $date ."\n" ;
    }
    
    ?>
    



    1. 読み取りが多いアプリケーションでdbrefまたは埋め込みドキュメントを使用する必要があります

    2. bashシェルスクリプトからmongoDBに接続する

    3. 存在する場合は配列内の要素を更新し、そうでない場合はMongoDbのその配列に新しい要素を挿入します

    4. nodejs mongodbネイティブドライバーで文字列をObjectIdに変換する方法は?