Efficient Paging in MongoDB with mgo: A Solution Using Cursor.min()
Mongo provides pagination functionality using Skip and Limit methods in query operations. However, these methods can become inefficient when the page number increases. To optimize paging, MongoDB introduced cursor.min() feature, which allows queries to start from a specific index entry.
Unfortunately, the mgo.v2 driver does not directly support cursor.min(). This article presents a solution using the Database.Run() method and find command to achieve efficient paging using cursor.min().
Manual Implementation
Create the Find Command:
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} }
Execute the Command:
var res struct { // Response fields } if err := db.Run(cmd, &res); err != nil { // Handle error }
Deserialize the Results:
var users []*User if err := db.C("users").NewIter(nil, res.Cursor.FirstBatch, 0, nil).All(&users); err != nil { // Handle error }
Get the Next Cursor:
if len(users) > 0 { lastUser := users[len(users)-1] // Convert last user to cursor data }
Convert Cursor Data to String:
if cursorData != nil { cursor := base64.RawURLEncoding.EncodeToString(bson.Marshal(cursorData)) }
Using the minquery Package
minquery provides a simplified interface to use cursor.min() with mgo.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 stores the cursor data for subsequent paging requests.
Note: When using minquery.All(), provide the field names used in the cursor (index entry) to enable the creation of the proper cursor value.
The above is the detailed content of How to Implement Efficient Paging in MongoDB's mgo.v2 Driver Using `cursor.min()`?. For more information, please follow other related articles on the PHP Chinese website!