使用最新的嵌套对象获取前5个文档

时间:2012-11-30 19:38:36

标签: php mongodb

我在MongoDB中有以下数据结构:

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

我有许多这些“垃圾”文件,其中有不同数量的小狗。时间戳数字越高,小狗的年龄越小(=后来出生)。

我想做的是从所有垃圾文件中收集五个最年幼的小狗。

我尝试了一些事情

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

获得有最小的小狗的五窝,然后从PHP脚本中的每一窝中提取最年幼的小狗。

但我不确定这是否能正常运作。关于如何做到这一点的任何想法(不改变数据结构)?

1 个答案:

答案 0 :(得分: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);
?>