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?

Tortue en cours d'exécution
la source

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
  });
Marni
la source
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
});
kcbanner
la source
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});
le code
la source
8
models.Post.find({published: true}, {sort: {'date': -1}, limit: 20}, function(err, posts) {
 // `posts` with sorted length of 20
});
Suhail Ahmed
la source
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) {});
rotimi-meilleur
la source
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

TGH
la source
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

Schmalitz
la source