Como faço para limitar o número de itens devolvidos?


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

Como posso limitar os itens devolvidos apenas aos últimos 10 itens que foram inseridos?

Respostas:


188

No mangusto mais recente (3.8.1 no momento da escrita), você faz duas coisas diferentes: (1) você tem que passar um único argumento para sort (), que deve ser um array de restrições ou apenas uma restrição, e (2 ) execFind () desapareceu e foi substituído por exec (). Portanto, com o mangusto 3.8.1 você faria isso:

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

ou você pode encadear simplesmente assim:

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

o que significa {'date': -1}? Desde já, obrigado!
kurumkan

3
@ArslArsl - os resultados serão classificados pela data em ordem decrescente.
NL Long

@ArslArsl é semelhante ao seguinte: { date: 'desc' } {date: 'descending'}. Veja esta resposta
rotimi-best

Existe um limite máximo?
lukas_o

20

Assim, 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
Muito obrigado, não sabia que você poderia fazer consultas como essa. Onde posso encontrar alguma forma de documentação sobre este método execFind?
Running Turtle

Honestamente, eu apenas vejo os exemplos nas fontes do mangusto e outras coisas, bem como os casos de teste. A lista de discussão também é boa. Os documentos reais parecem um pouco desatualizados.
kcbanner

1
execFind ainda está na versão mais recente do mongoosejs?
Manny

2
@Manny Não é. Veja a resposta da marni para uma versão atualizada.
JohnnyHK

15

Sou um pouco preguiçoso, então gosto de coisas 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
Embora este trecho de código possa resolver a questão, incluir uma explicação de como e por que isso resolve o problema realmente ajudaria a melhorar a qualidade de sua postagem. Lembre-se de que você está respondendo às perguntas para os leitores no futuro, não apenas para a pessoa que está perguntando agora! Por favor edite sua resposta para adicionar explicação, e dar uma indicação do que limitações e premissas se aplicam.
Toby Speight

2

Parâmetros de localização

Os parâmetros usados ​​pela função find são os seguintes:

  1. condições «Object».
  2. [projeção] «Object|String»campos opcionais para retornar, consulte Query.prototype.select ()
  3. [opções] «Object»opcional, consulte Query.prototype.setOptions ()
  4. [ligue de volta] «Function»

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

Informação extra

O Mongoose permite que você consulte suas coleções de diferentes maneiras, como: Documentação 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 algum motivo, não consegui fazer isso funcionar com as respostas propostas, mas encontrei outra variação, usando select, que funcionou para mim:

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

A API talvez tenha mudado? Estou usando a versão 3.8.19


1

... além disso, certifique-se de usar:

mongoose.Promise = Promise;

Isso define a promessa do mangusto para a promessa ES6 nativa. Sem esta adição, eu tenho:

Aviso de descontinuação: Mongoose: mpromise (biblioteca de promessa padrão do mongoose) está obsoleta, conecte sua própria biblioteca de promessa: http://mongoosejs.com/docs/promises.html

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.