2

MongoDB には次のデータ構造があります。

{ "_id" : ObjectId( "xy" ),
  "litter" : [ 
    { "puppy_name" : "Tom",
      "birth_timestamp" : 1353963728 }, 
    { "puppy_name" : "Ann",
      "birth_timestamp" : 1353963997 }
   ]
}

私は、さまざまな数の子犬を含むこれらの「ごみ」ドキュメントを多数持っています。タイムスタンプの数字が大きいほど、子犬は若い (= 遅く生まれる) ことになります。

私がやりたいことは、すべてのごみドキュメントのコレクションから 5 匹の最年少の子犬を取得することです。

私は一緒に何かを試しました

find().sort('litter.birth_timestamp' : -1).limit(5)

最も若い子犬がいる 5 つの同腹児を取得し、PHP スクリプトの各同腹児から最も若い子犬を抽出します。

しかし、これが適切に機能するかどうかはわかりません。(データ構造を変更せずに)これを正しく行う方法について何か考えはありますか?

4

1 に答える 1

1

これを実現するために、MongoDB 2.2の新しいAggregation Frameworkを使用できます。

<?php
    $m = new Mongo();
    $collection = $m->selectDB("test")->selectCollection("puppies");

    $pipeline = array(

        // Create a document stream (one per puppy)
        array('$unwind' => '$litter'),

        // Sort by birthdate descending
        array('$sort' => array (
            'litter.birth_timestamp' => -1
        )),

        // Limit to 5 results
        array('$limit' => 5)
    );

    $results = $collection->aggregate($pipeline);
    var_dump($results);
?>
于 2012-11-30T20:22:58.377 に答える