2012-09-24 95 views
2

我正在尝试检索我的集合中的第n个条目。
这似乎工作使用find()但我认为有一个更清洁的解决方案使用findOne()和也许sort()
谁能帮助与写作的一种更好的方式取悦这个php mongodb找到集合中的第n个条目

$mongo = new Mongo(); 
$db = $mongo->mydb; 
$collection = $db->user; 

$cursor = $collection->find(); 
$i=0; 
foreach ($cursor as $obj){ 
    if ($i==3) 
     echo $obj["_id"];//echo's the 3rd entry id 
    $i++; 
} 

solution provided here并不适用于我的问题,这就是为什么我在问这个问题。的

+0

类似的问题,在这里回答, 的http://计算器。 com/questions/7223273/get-n-th-element-of-an-array-in-mongo – ncremins

+1

@creminsn,这是关于文档中的数组,tq正在讨论集合中的第n个文档。 –

回答

2

使用跳跃(N-1),从上面的代码:

$cursor = $collection->find(); 
$cursor->skip(3); 
$cursor->next(); 
$doc = $cursor->current(); 

但我觉得可能是最好的办法是让你的文档中的计数器,可以作为索引使用。

+0

谢谢,你能否详细说明为什么需要索引? btw没有'$ cursor-> next()',没有输出 –

+0

因此,你可以通过一个动作找到唯一的文档,而不是可能需要“遍历”整个集合的游标(取决于值你的跳过) –

+0

所以像我原来的帖子计数器?或者是其他东西? –

4

Skip()不会有效地使用索引,因此将索引放在集合中的任何字段都是毫无意义的。

由于您希望获得skip()第n个文档,如果skip()的值较低(取决于您的系统,但通常在完整集合扫描的100K行以下),则可能是OK。问题是,通常情况并非如此。即使有索引,Mongo也需要扫描整个结果集,然后才能跳过它,这将导致完整的集合扫描,而不管您的查询中是什么。

如果要经常以随机方式进行此操作,最好使用与findAndModify结合的另一个集合的递增ID来生成准确的文档编号(http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field)。

但是这会导致问题,您必须保留此ID,特别是在发生删除时。其中一种方法是将文档标记为已删除而不是实际删除它们。当您查询的确切文件省略删除和limit()一个让你获得下一个最近的文件到该位置,像这样:

$cur = $db->collection->find(array('ai_id' => array('$gt' => 403454), 'deleted' => 0))->limit(1); 
$cursor->next(); 
$doc = $cursor->current();