Maison > développement back-end > Golang > Comment implémenter une pagination efficace dans MongoDB avec mgo.v2 sans prise en charge native de curseur.min() ?

Comment implémenter une pagination efficace dans MongoDB avec mgo.v2 sans prise en charge native de curseur.min() ?

DDD
Libérer: 2024-12-17 22:02:10
original
730 Les gens l'ont consulté

How to Implement Efficient Paging in MongoDB with mgo.v2 without Native cursor.min() Support?

Paging efficace dans MongoDB avec mgo à l'aide de curseur.min()

Capacités de pagination de MongoDB, couramment implémentées à l'aide de Query.Skip() et Query .Limit(), peut devenir lent lorsque le numéro de page augmente. Pour résoudre ce problème, MongoDB a introduit curseur.min(), qui permet de spécifier la première entrée d'index à partir de laquelle commencer à lister les résultats.

Limitations de mgo.v2

Malheureusement, le pilote mgo.v2 ne prend pas en charge le curseur.min(). Cependant, cette fonctionnalité peut être obtenue à l'aide de la méthode Database.Run() pour exécuter des commandes MongoDB, y compris la commande find.

Implémentation manuelle d'une pagination efficace

  1. Construisez la commande find avec un filtre, un tri, une limite et éventuellement l'argument curseur.min().
  2. Exécutez la commande en utilisant Database.Run() et décodez les résultats.
  3. Transformez les résultats dans le type souhaité à l'aide de Collection.NewIter().
  4. Générez les nouvelles données du curseur à partir du dernier document du lot.
  5. Utilisez l'encodage base64 pour convertir les données du curseur en une chaîne sécurisée pour le Web.

Utilisation github.com/icza/minquery

Le package minquery fournit un wrapper qui simplifie le processus d'exécution d'une commande find avec la prise en charge de curseur.min().

q := minquery.New(session.DB(""), "users", bson.M{"country" : "USA"}).
    Sort("name", "_id").Limit(10)
// If this is not the first page, set cursor:
if cursor := getLastCursor(); cursor != "" {
    q = q.Cursor(cursor)
}

var users []*User
newCursor, err := q.All(&users, "country", "name", "_id")
Copier après la connexion

Remarque : Lorsque vous utilisez minquery.All(), spécifiez les noms des champs du curseur lors du décodage des résultats, même s'ils ne sont pas utilisés directement. Ceci est crucial pour générer les données du curseur pour les requêtes ultérieures.

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