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?
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.
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>"); } );
}