Jak mogę ograniczyć liczbę zwracanych produktów?

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

Jak mogę ograniczyć zwracane produkty tylko do ostatnich 10 wstawionych pozycji?

Running Turtle
źródło

Odpowiedzi:

189

W najnowszej mongoose (3.8.1 w czasie pisania) robisz dwie rzeczy inaczej: (1) musisz przekazać pojedynczy argument do sort (), który musi być tablicą ograniczeń lub tylko jednym ograniczeniem, oraz (2 ) execFind () zniknęła i zamiast tego została zastąpiona przez exec (). Dlatego w przypadku mangusty 3.8.1 zrobiłbyś to:

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

lub możesz połączyć go ze sobą po prostu w ten sposób:

models.Post
  .find({published: true})
  .sort({'date': -1})
  .limit(20)
  .exec(function(err, posts) {
       // `posts` will be of length 20
  });
marni
źródło
co oznacza {'date': -1}? Z góry dziękuję!
kurumkan
3
@ArslArsl - wyniki zostaną posortowane według daty w kolejności malejącej.
NL Long
@ArslArsl jest podobny do poniższego: { date: 'desc' } {date: 'descending'}. Zobacz tę odpowiedź
rotimi-best
Czy istnieje maksymalny limit?
lukas_o
20

W ten sposób, używając .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
źródło
2
Wielkie dzięki, nie wiedziałem, że możesz tworzyć takie zapytania. Gdzie mogę znaleźć dokumentację dotyczącą tej metody execFind?
Running Turtle
Szczerze mówiąc, po prostu patrzę na przykłady w źródłach mangusty i innych rzeczach, a także na przypadkach testowych. Lista mailingowa też jest dobra. Rzeczywiste dokumenty wydają się nieco nieaktualne.
kcbanner
1
czy execFind jest nadal w najnowszej wersji mongoosejs?
Manny
2
@Manny To nie jest. Zobacz odpowiedź marni na zaktualizowaną wersję.
JohnnyHK
15

Jestem trochę leniwy, więc lubię proste rzeczy:

let users = await Users.find({}, null, {limit: 50});
kod
źródło
8
models.Post.find({published: true}, {sort: {'date': -1}, limit: 20}, function(err, posts) {
 // `posts` with sorted length of 20
});
Suhail Ahmed
źródło
5
Chociaż ten fragment kodu może rozwiązać problem, w tym wyjaśnienie, jak i dlaczego to rozwiązuje problem , naprawdę pomogłoby poprawić jakość Twojego posta. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a nie tylko osoba, która zapyta teraz! Proszę edytować swoje odpowiedzi, aby dodać wyjaśnienie, i dać wskazówkę co zastosować ograniczenia i założenia.
Toby Speight
2

Znajdź parametry

Parametry funkcji find są następujące:

  1. warunki «Object».
  2. [projekcja] «Object|String»opcjonalne pola do zwrócenia, zobacz Query.prototype.select ()
  3. [opcje] «Object»opcjonalnie zobacz Query.prototype.setOptions ()
  4. [oddzwonić] «Function»

Jak ograniczyć

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

Informacje dodatkowe

Mongoose umożliwia przeszukiwanie kolekcji na różne sposoby, na przykład: Oficjalna dokumentacja

// 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-best
źródło
1

Z jakiegoś powodu nie mogłem sprawić, żeby to działało z proponowanymi odpowiedziami, ale znalazłem inną odmianę, używając funkcji select, która zadziałała dla mnie:

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

Czy interfejs API się zmienił? Używam wersji 3.8.19

TGH
źródło
1

... dodatkowo upewnij się, że używasz:

mongoose.Promise = Promise;

To ustawia obietnicę mangusty na natywną obietnicę ES6. Bez tego dodatku otrzymałem:

Przestarzałe Ostrzeżenie: Mongoose: mpromise (domyślna biblioteka obietnic mongoose) jest przestarzała, zamiast tego podłącz własną bibliotekę obietnic: http://mongoosejs.com/docs/promises.html

Schmalitz
źródło