Maison >développement back-end >Golang >Comment implémenter une pagination efficace dans le pilote mgo.v2 de MongoDB à l'aide de « cursor.min() » ?

Comment implémenter une pagination efficace dans le pilote mgo.v2 de MongoDB à l'aide de « cursor.min() » ?

DDD
DDDoriginal
2024-12-31 06:38:14651parcourir

How to Implement Efficient Paging in MongoDB's mgo.v2 Driver Using `cursor.min()`?

Paging efficace dans MongoDB avec mgo : une solution utilisant Cursor.min()

Mongo fournit une fonctionnalité de pagination à l'aide des méthodes Skip et Limit dans la requête opérations. Cependant, ces méthodes peuvent devenir inefficaces lorsque le nombre de pages augmente. Pour optimiser la pagination, MongoDB a introduit la fonctionnalité curseur.min(), qui permet aux requêtes de démarrer à partir d'une entrée d'index spécifique.

Malheureusement, le pilote mgo.v2 ne prend pas directement en charge curseur.min(). Cet article présente une solution utilisant la méthode Database.Run() et la commande find pour obtenir une pagination efficace à l'aide de curseur.min().

Implémentation manuelle

  1. Créer la recherche Commande :

    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}
    }
  2. Exécuter la commande :

    var res struct {
        // Response fields
    }
    if err := db.Run(cmd, &res); err != nil {
        // Handle error
    }
  3. Désérialiser le Résultats :

    var users []*User
    if err := db.C("users").NewIter(nil, res.Cursor.FirstBatch, 0, nil).All(&users); err != nil {
        // Handle error
    }
  4. Obtenir le curseur suivant :

    if len(users) > 0 {
        lastUser := users[len(users)-1]
        // Convert last user to cursor data
    }
  5. Convertir Données du curseur vers String :

    if cursorData != nil {
        cursor := base64.RawURLEncoding.EncodeToString(bson.Marshal(cursorData))
    }

Utilisation du package minquery

minquery fournit une interface simplifiée pour utiliser curseur.min() avec 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 stocke les données du curseur pour la pagination ultérieure requêtes.

Remarque : Lorsque vous utilisez minquery.All(), fournissez les noms de champs utilisés dans le curseur (entrée d'index) pour permettre la création de la valeur de curseur appropriée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn