mgo を使用した MongoDB の効率的なページング: Cursor.min() を使用したソリューション
Mongo はクエリで Skip メソッドと Limit メソッドを使用したページネーション機能を提供します操作。ただし、ページ数が増加すると、これらの方法は非効率になる可能性があります。ページングを最適化するために、MongoDB には、特定のインデックス エントリからクエリを開始できるようにするcursor.min() 機能が導入されました。
残念ながら、mgo.v2 ドライバーは、cursor.min() を直接サポートしていません。この記事では、Database.Run() メソッドと find コマンドを使用して、cursor.min() を使用して効率的なページングを実現するソリューションを紹介します。
手動実装
検索を作成するコマンド:
cmd := bson.D{ {Name: "find", Value: "users"}, // Your query conditions {Name: "sort", Value: bson.D{ {Name: "name", Value: 1}, {Name: "_id", Value: 1} }}, {Name: "limit", Value: 10}, {Name: "batchSize", Value: 10}, {Name: "singleBatch": true} }
コマンドを実行:
var res struct { // Response fields } if err := db.Run(cmd, &res); err != nil { // Handle error }
デシリアライズ結果:
var users []*User if err := db.C("users").NewIter(nil, res.Cursor.FirstBatch, 0, nil).All(&users); err != nil { // Handle error }
次のカーソルの取得:
if len(users) > 0 { lastUser := users[len(users)-1] // Convert last user to cursor data }
変換カーソルデータを文字列:
if cursorData != nil { cursor := base64.RawURLEncoding.EncodeToString(bson.Marshal(cursorData)) }
minquery パッケージの使用
minquery は、mgo でcursor.min() を使用するための簡素化されたインターフェイスを提供します。 .v2:
q := minquery.New(session.DB(""), "users", bson.M{"country": "USA"}). Sort("name", "_id").Limit(10) if cursor := getLastCursor(); cursor != "" { q = q.Cursor(cursor) } var users []*User newCursor, err := q.All(&users, "country", "name", "_id")
newCursor後続のページング要求のカーソル データを保存します。
注: minquery.All() を使用する場合、カーソル (インデックス エントリ) で使用されるフィールド名を指定して、適切なページング リクエストを作成できるようにします。カーソル値。
以上が`cursor.min()` を使用して MongoDB の mgo.v2 ドライバーに効率的なページングを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。