web-dev-qa-db-fra.com

Comment faire de la pagination à l'aide de requêtes de la plage dans MongoDB?

Je manque probablement quelque chose puisque j'apprends toujours les instantanés de MongoDB, mais j'ai besoin d'aide pour paginer une collection.

J'ai une collection qui a une liste de noms.

Fond en bas de boeuf
Poitrine de poulet 6 oz
Poitrine de poulet 8 oz
Poitrine de poulet 8 oz
Poitrine de poulet 8 oz
Poitrine de poulet aléatoire
Cuisses de poulet
[.____] Filet de poulet
Cuisses de poulet
[.____] Sel casher

J'ai créé un index composé sur "produitName, _ID".

Je gère cette requête:

db.ProductGuideItem.find( { ProductName: { $gt: "Chicken Breast 8oz" } } ).sort({ProductName:1,_id:1}).limit(3); 

Avis Il y a 3 éléments "Poitrine de poulet 8 oz".

Si je courais cette requête, je reçois ...
Poitrine de poulet aléatoire
Cuisses de poulet
[.____] Filet de poulet

Si je faisais une pagination et que je commençais du haut. La requête aurait manqué l'autre 2 "Poitrine de poulet 8oz".

Donc, si chaque page ne peut avoir que 3 articles et que je veux voir la page 2 puis je devrais voir ..
Poitrine de poulet 8 oz
Poitrine de poulet 8 oz
Poitrine de poulet aléatoire.

Mais je ne suis pas. Cela va au dernier poitrine de poulet 8 oz et à partir de là.

Y a-t-il un moyen de contourner ceci?
[.____] aussi comment ferais-je cela si la liste a été triée de manière opposée?

20
Donny V.

Depuis la collection, je portais des valeurs dupliquées que je devais créer un indice composé sur le nom de produit et ID.

Créer un index composé

db.ProductGuideItem.ensureIndex({ ProductName:1, _id:1});

Cela a résolu mon problème.
[.____] Référence: https://groups.google.com/d/msg/mongodb-user/3ezzirjzw_a/oyh79npkzhkj

En supposant que vous avez ces valeurs:

{a:1, b:1}
{a:2, b:1}
{a:2, b:2}
{a:2, b:3}
{a:3, b:1}

Donc, vous le faites pour la pagination à la plage (taille de la page de 2):

1ère page

find().sort({a:1, b:1}).limit(2)
{a:1, b:1}
{a:2, b:1}

2ème page

find().min({a:2, b:1}).sort({a:1, b:1}).skip(1).limit(2)

{a:2, b:2}
{a:2, b:3}

3ème page

find().min({a:2, b:3}).sort({a:1, b:1}).skip(1).limit(2)
{a:3, b:1}

Voici les documents pour $ min/max: http://www.mongodb.org/display/docs/min+and+MAX+Query+Specificateurs

Si vous n'avez pas de valeurs en double dans votre collection, vous n'avez pas besoin d'utiliser Min & Max ni créer un indice composé. Vous pouvez simplement utiliser $ LT & $ GT.

29
Donny V.

Vous avez juste besoin d'appeler Skip sur le curseur

voir la documentation de MongoDB sur Cursor Skip "Cette approche peut être utile pour mettre en œuvre des résultats" paginés "".

Cet exemple est extrait de MongoDB exemple

function printStudents(pageNumber, nPerPage) {
   print("Page: " + pageNumber);
   db.students.find().skip((pageNumber-1)*nPerPage).limit(nPerPage).forEach( function(student) { print(student.name + "<p>"); } );
}
11
moshe beeri