Skip()はインデックスを効果的に使用しないため、コレクション内の任意のフィールドにインデックスを配置しても意味がありません。
skip()
したいので skip()
の値の場合、n番目のドキュメント が低い(システムによって異なりますが、通常、フルコレクションスキャンで100K行未満)場合は、問題ない可能性があります。問題は、通常はそうではないということです。 Mongoは、インデックスがある場合でも、結果セット全体をスキャンしてからスキップする必要があります。これにより、クエリの内容に関係なく、完全なコレクションスキャンが発生します。
これを頻繁かつランダムな方法で行う場合は、別のコレクションをfindAndModify
と組み合わせて増分IDを使用する方がよい場合があります。 正確なドキュメント番号を生成します(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();