Wie beschränke ich die Anzahl der zurückgegebenen Artikel?

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

Wie kann ich die zurückgegebenen Artikel auf die letzten 10 Artikel beschränken, die eingefügt wurden?

Laufende Schildkröte
quelle

Antworten:

188

Im neuesten Mungo (3.8.1 zum Zeitpunkt des Schreibens) machen Sie zwei Dinge unterschiedlich: (1) Sie müssen ein einzelnes Argument an sort () übergeben, das ein Array von Einschränkungen oder nur eine Einschränkung sein muss, und (2) ) execFind () ist weg und wird stattdessen durch exec () ersetzt. Daher würden Sie mit dem Mungo 3.8.1 Folgendes tun:

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

oder Sie können es einfach so miteinander verketten:

models.Post
  .find({published: true})
  .sort({'date': -1})
  .limit(20)
  .exec(function(err, posts) {
       // `posts` will be of length 20
  });
marni
quelle
Was bedeutet {'Datum': -1}? Danke im Voraus!
Kurumkan
3
@ArslArsl - Die Ergebnisse werden nach dem Datum in absteigender Reihenfolge sortiert.
NL Long
@ArslArsl es ist ähnlich wie folgt : { date: 'desc' } {date: 'descending'}. Siehe diese Antwort
rotimi-best
Gibt es ein Maximum für das Limit?
lukas_o
20

So verwenden Sie .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
quelle
2
Vielen Dank, ich wusste nicht, dass Sie solche Fragen stellen können. Wo finde ich eine Dokumentation zu dieser execFind-Methode?
Laufende Schildkröte
Ehrlich gesagt, ich schaue mir nur die Beispiele in den Mungoquellen und -sachen sowie die Testfälle an. Die Mailingliste ist auch gut. Die eigentlichen Dokumente scheinen etwas veraltet zu sein.
Kcbanner
1
ist execFind noch in der neuesten Version von mongoosejs?
Manny
2
@Manny ist es nicht. Eine aktualisierte Version finden Sie in der Antwort des Marni.
JohnnyHK
15

Ich bin ein bisschen faul, deshalb mag ich einfache Dinge:

let users = await Users.find({}, null, {limit: 50});
der Code
quelle
8
models.Post.find({published: true}, {sort: {'date': -1}, limit: 20}, function(err, posts) {
 // `posts` with sorted length of 20
});
Suhail Ahmed
quelle
5
Während dieses Code-Snippet die Frage lösen kann, einschließlich einer Erklärung, wie und warum dies das Problem löst, würde dies wirklich dazu beitragen , die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt! Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, und geben Sie an, welche Einschränkungen und Annahmen gelten.
Toby Speight
2

Parameter finden

Die Parameter für die Suchfunktion lauten wie folgt:

  1. Bedingungen «Object».
  2. [Projektion] «Object|String»Optionale Felder, die zurückgegeben werden sollen, siehe Query.prototype.select ()
  3. [Optionen] «Object»optional siehe Query.prototype.setOptions ()
  4. [zurückrufen] «Function»

Wie man begrenzt

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

Zusatzinformation

Mit Mongoose können Sie Ihre Sammlungen auf verschiedene Arten abfragen, z. B.: Offizielle Dokumentation

// 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-am besten
quelle
1

Aus irgendeinem Grund konnte ich dies nicht mit den vorgeschlagenen Antworten zum Laufen bringen, aber ich fand mit select eine andere Variante, die für mich funktionierte:

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

Hat sich die API vielleicht geändert? Ich benutze Version 3.8.19

TGH
quelle
1

... stellen Sie außerdem sicher, dass Sie Folgendes verwenden:

mongoose.Promise = Promise;

Dies setzt das Mungo-Versprechen auf das native ES6-Versprechen. Ohne diesen Zusatz habe ich:

DeprecationWarning: Mongoose: mpromise (die Standardversprechenbibliothek von mongoose) ist veraltet. Schließen Sie stattdessen Ihre eigene Versprechenbibliothek an: http://mongoosejs.com/docs/promises.html

Schmalitz
quelle