我正在尝试检索我的收藏中的第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不适用于我的问题,这就是我提出这个问题的原因。
答案 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();
但我认为最好的方法可能是在文档中保留一个可用作索引的计数器。