¿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?

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

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

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

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

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

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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.