Comment limiter le nombre d'articles retournés?


113
myModel.find({}, function(err, items) {
    console.log(items.length);    // Big number
});

Comment puis-je limiter les articles retournés aux 10 derniers articles insérés?

Réponses:


188

Dans la dernière mangouste (3.8.1 au moment de la rédaction), vous faites deux choses différemment: (1) vous devez passer un seul argument à sort (), qui doit être un tableau de contraintes ou juste une contrainte, et (2 ) execFind () est parti, et remplacé par exec () à la place. Par conséquent, avec la mangouste 3.8.1, vous feriez ceci:

var q = models.Post.find({published: true}).sort({'date': -1}).limit(20);
q.exec(function(err, posts) {
     // `posts` will be of length 20
});

ou vous pouvez l'enchaîner simplement comme ça:

models.Post
  .find({published: true})
  .sort({'date': -1})
  .limit(20)
  .exec(function(err, posts) {
       // `posts` will be of length 20
  });

que signifie {'date': -1}? Merci d'avance!
kurumkan

3
@ArslArsl - les résultats seront triés par date dans l'ordre décroissant.
NL Long

@ArslArsl est similaire à ce qui suit: { date: 'desc' } {date: 'descending'}. Voir cette réponse
rotimi-best

Y a-t-il un maximum pour la limite?
lukas_o le

20

Comme ça, en utilisant .limit ():

var q = models.Post.find({published: true}).sort('date', -1).limit(20);
q.execFind(function(err, posts) {
  // `posts` will be of length 20
});

2
Merci beaucoup, je ne savais pas que vous pouviez faire des requêtes comme ça. Où puis-je trouver une forme de documentation sur cette méthode execFind?
Running Turtle

Honnêtement, je regarde juste les exemples dans les sources mangouste et tout, ainsi que les cas de test. La liste de diffusion est également bonne. Les documents réels semblent un peu dépassés.
kcbanner

1
est execFind toujours dans la dernière version de mongoosejs?
Manny

2
@Manny Ce n'est pas le cas. Voir la réponse de marni pour une version mise à jour.
JohnnyHK

15

Je suis un peu paresseux, alors j'aime les choses simples:

let users = await Users.find({}, null, {limit: 50});

8
models.Post.find({published: true}, {sort: {'date': -1}, limit: 20}, function(err, posts) {
 // `posts` with sorted length of 20
});

5
Bien que cet extrait de code puisse résoudre la question, inclure une explication sur la façon et la raison pour laquelle cela résout le problème aiderait vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir, pas seulement à la personne qui la pose maintenant! Veuillez modifier votre réponse pour ajouter une explication et donner une indication des limitations et hypothèses applicables.
Toby Speight

2

Rechercher des paramètres

Les paramètres de la fonction de recherche sont les suivants:

  1. conditions «Object».
  2. [projection] «Object|String»champs facultatifs à renvoyer, voir Query.prototype.select ()
  3. [options] «Object»facultatif voir Query.prototype.setOptions ()
  4. [rappeler] «Function»

Comment limiter

const Post = require('./models/Post');

Post.find(
  { published: true }, 
  null, 
  { sort: { 'date': 'asc' }, limit: 20 },
  function(error, posts) {
   if (error) return `${error} while finding from post collection`;

   return posts; // posts with sorted length of 20
  }
);

Informaitons supplémentaires

Mongoose vous permet d'interroger vos collections de différentes manières comme: Documentation officielle

// named john and at least 18
MyModel.find({ name: 'john', age: { $gte: 18 }});

// executes, passing results to callback
MyModel.find({ name: 'john', age: { $gte: 18 }}, function (err, docs) {});

// executes, name LIKE john and only selecting the "name" and "friends" fields
MyModel.find({ name: /john/i }, 'name friends', function (err, docs) { })

// passing options
MyModel.find({ name: /john/i }, null, { skip: 10 })

// passing options and executes
MyModel.find({ name: /john/i }, null, { skip: 10 }, function (err, docs) {});

// executing a query explicitly
var query = MyModel.find({ name: /john/i }, null, { skip: 10 })
query.exec(function (err, docs) {});

// using the promise returned from executing a query
var query = MyModel.find({ name: /john/i }, null, { skip: 10 });
var promise = query.exec();
promise.addBack(function (err, docs) {});

1

Pour une raison quelconque, je n'ai pas pu faire fonctionner cela avec les réponses proposées, mais j'ai trouvé une autre variante, en utilisant select, qui a fonctionné pour moi:

models.Post.find().sort('-date').limit(10).select('published').exec(function(e, data){
        ...
});

L'API a-t-elle peut-être changé? J'utilise la version 3.8.19


1

... assurez-vous également d'utiliser:

mongoose.Promise = Promise;

Cela met la promesse de la mangouste à la promesse native ES6. Sans cet ajout, j'ai:

DeprecationWarning: Mongoose: mpromise (la bibliothèque de promesses par défaut de mangouste) est obsolète, branchez votre propre bibliothèque de promesses à la place: http://mongoosejs.com/docs/promises.html

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.