我在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脚本中的每一窝中提取最年幼的小狗。
但我不确定这是否能正常运作。关于如何做到这一点的任何想法(不改变数据结构)?
答案 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);
?>