php mongodb在收藏中找到第n个条目

时间:2012-09-24 20:33:23

标签: php mongodb

我正在尝试检索我的收藏中的第n个条目 这似乎可以使用find(),但我认为有一个更清洁的解决方案使用findOne(),也许sort()
请有人帮忙写出更好的写作方式

$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不适用于我的问题,这就是我提出这个问题的原因。

2 个答案:

答案 0 :(得分:4)

Skip()没有有效使用索引,因此在集合中的任何字段上放置索引都是没有意义的。

由于您希望skip()个第n个文档,如果skip()的值很低(取决于您的系统,但在完整集合扫描中通常低于100K行),那么它可能没问题。问题是通常情况并非如此。 Mongo,即使有索引,也需要扫描整个结果集,然后才能跳过它,无论您的查询是什么,都会导致完整的收集扫描。

如果您经常以随机方式执行此操作,最好使用递增ID将另一个集合与findAndModify组合以生成准确的文档编号(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();

答案 1 :(得分:2)

使用上面代码中的(n-1)跳过:

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

但我认为最好的方法可能是在文档中保留一个可用作索引的计数器。