¿Cómo limito la cantidad de artículos devueltos?

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

¿Cómo puedo limitar los artículos devueltos a solo los últimos 10 artículos que se insertaron?

Tortuga corriendo
fuente

Respuestas:

188

En la última mangosta (3.8.1 en el momento de escribir este artículo), hace dos cosas de manera diferente: (1) debe pasar un único argumento a sort (), que debe ser una matriz de restricciones o solo una restricción, y (2 ) execFind () desaparece y se reemplaza con exec () en su lugar. Por lo tanto, con la mangosta 3.8.1 harías esto:

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

o puede encadenarlo simplemente así:

models.Post
  .find({published: true})
  .sort({'date': -1})
  .limit(20)
  .exec(function(err, posts) {
       // `posts` will be of length 20
  });
marni
fuente
¿Qué significa {'fecha': -1}? ¡Gracias por adelantado!
Kurumkan
3
@ArslArsl: los resultados se ordenarán por fecha en orden descendente.
NL Long
@ArslArsl es similar a la siguiente: { date: 'desc' } {date: 'descending'}. Ver esta respuesta
rotimi-best
¿Hay un límite máximo?
lukas_o
20

Así, usando .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
fuente
2
Muchas gracias, no sabía que podías hacer consultas como esa. ¿Dónde puedo encontrar algún tipo de documentación sobre este método execFind?
Running Turtle
Honestamente, solo miro los ejemplos en las fuentes de mangostas y esas cosas, así como los casos de prueba. La lista de correo también es buena. Los documentos reales parecen un poco desactualizados.
kcbanner
1
¿execFind todavía está en la última versión de mongoosejs?
Manny
2
@Manny No lo es. Vea la respuesta de marni para una versión actualizada.
JohnnyHK
15

Soy un poco vago, así que me gustan las cosas simples:

let users = await Users.find({}, null, {limit: 50});
el código
fuente
8
models.Post.find({published: true}, {sort: {'date': -1}, limit: 20}, function(err, posts) {
 // `posts` with sorted length of 20
});
Suhail Ahmed
fuente
5
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, ¡no solo la persona que pregunta ahora! Por favor, editar su respuesta para agregar explicación y dar una indicación de lo que se aplican limitaciones y supuestos.
Toby Speight
2

Encontrar parámetros

Los parámetros que toma la función de búsqueda son los siguientes:

  1. condiciones «Object».
  2. [proyección] «Object|String»campos opcionales para devolver, consulte Query.prototype.select ()
  3. [opciones] «Object»opcional ver Query.prototype.setOptions ()
  4. [llamar de vuelta] «Function»

Cómo limitar

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
  }
);

Información extra

Mongoose te permite consultar tus colecciones de diferentes formas como: Documentación oficial

// 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-mejor
fuente
1

Por alguna razón, no pude hacer que esto funcionara con las respuestas propuestas, pero encontré otra variación, usando select, que funcionó para mí:

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

¿Ha cambiado quizás la API? Estoy usando la versión 3.8.19

TGH
fuente
1

... además, asegúrese de utilizar:

mongoose.Promise = Promise;

Esto establece la promesa de mangosta a la promesa nativa de ES6. Sin esta adición obtuve:

DeprecationWarning: Mongoose: mpromise (la biblioteca de promesas predeterminada de mangoose) está en desuso, conecte su propia biblioteca de promesas en su lugar: http://mongoosejs.com/docs/promises.html

Schmalitz
fuente