カスタム カーソル管理で mgo を使用した MongoDB での効率的なページング
問題:
mgo の間.v2 は組み込みのページング メソッド (Query.Skip() およびQuery.Limit()) を使用すると、最初の x 個のドキュメント (Skip() によって決定) をスキップする前にすべてのドキュメントを反復処理する必要があるため、大きな結果リストの場合は非効率になります。
解決策:
MongoDB は、目的の結果にジャンプするためのcursor.min() を提供し、処理されるドキュメントの数を減らします。ただし、mgo.v2 には、cursor.min() を指定するためのネイティブ サポートがありません。
Database.Run() および Find コマンド:
cursor.min() を利用するにはネイティブ サポートがない場合は、Database.Run() を使用して、カスタム クエリで検索コマンドを実行できます。ここで、必要な開始インデックスを示す min 引数を指定します。エントリ.
カーソル データのエンコード:
クエリの実行後、結果の最初のバッチからカーソル データを取得する必要があります。このデータを効率的に保存および送信するには、 bson.Marshal() を Base64 エンコーディングと組み合わせて使用し、Web セーフなカーソル文字列を生成します。
カーソル管理:
ページ間のカーソルを管理するには、base64 エンコーディングと bson エンコーディングをそれぞれ使用してカーソルをデコードおよび再エンコードできます。これにより、中断したところからクエリを再開できるようになります。
github.com/icza/minquery を使用する:
あるいは、minquery パッケージを使用することもできます。カーソル指定を使用して MongoDB 検索コマンドを設定および実行するためのラッパーを提供します。ページ間のカーソル管理プロセスが簡素化されます。
コード スニペット:
カスタム カーソル管理 (手動アプローチ):
query := mgo.Query{ Limit: 10, } if min != nil { query = query.Skip(1).Min(min) }
minquery パッケージアプローチ:
query := minquery.New(). Cursor(cursor). Limit(10)
以上が大規模な結果セットに対して mgo.v2 を使用して MongoDB に効率的なページングを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。