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
Libérer: 2024-12-31 06:38:14
original
637 Les gens l'ont consulté

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}
    }
    Copier après la connexion
  2. Exécuter la commande :

    var res struct {
        // Response fields
    }
    if err := db.Run(cmd, &res); err != nil {
        // Handle error
    }
    Copier après la connexion
  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
    }
    Copier après la connexion
  4. Obtenir le curseur suivant :

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

    if cursorData != nil {
        cursor := base64.RawURLEncoding.EncodeToString(bson.Marshal(cursorData))
    }
    Copier après la connexion

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")
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal