2

コレクションの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++;
}

ここで提供される解決策は私の問題には当てはまりません。そのため、私はこの質問をしています。

4

2 に答える 2

4

Skip()はインデックスを効果的に使用しないため、コレクション内の任意のフィールドにインデックスを配置しても意味がありません。

n番目のドキュメントが必要skip()なため、の値skip()が低い場合(システムによって異なりますが、通常、フルコレクションスキャンでは100K行未満)、問題ない可能性があります。問題は、通常はそうではないということです。Mongoは、インデックスがある場合でも、結果セット全体をスキャンしてからスキップする必要があります。これにより、クエリの内容に関係なく、完全なコレクションスキャンが実行されます。

これを頻繁かつランダムな方法で行う場合は、増分IDを使用して、別のコレクションと組み合わせfindAndModifyて正確なドキュメント番号を生成することをお勧めします(http://www.mongodb.org/display/DOCS/How+to+Make + an + Auto + Incrementing + Field)。

ただし、これは問題を引き起こします。特に削除が発生した場合は、このIDを維持する必要があります。これを回避する1つの方法は、ドキュメントを実際に削除するのではなく、削除済みとしてマークすることです。正確なドキュメントをクエリするときは、削除を省略limit()し、次のようにその位置に次に近いドキュメントを取得できるようにします。

$cur = $db->collection->find(array('ai_id' => array('$gt' => 403454), 'deleted' => 0))->limit(1);
$cursor->next();
$doc = $cursor->current();
于 2012-09-25T07:34:42.003 に答える
2

上記のコードから、(n-1)のスキップを使用します。

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

しかし、おそらく最善の方法は、インデックスとして使用できるカウンターをドキュメントに保持することだと思います。

于 2012-09-24T20:52:31.360 に答える