Bagaimana cara membatasi jumlah barang yang dikembalikan?

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

Bagaimana cara membatasi item yang dikembalikan hanya 10 item terakhir yang dimasukkan?

Menjalankan Turtle
sumber

Jawaban:

188

Dalam luwak terbaru (3.8.1 pada saat penulisan), Anda melakukan dua hal secara berbeda: (1) Anda harus meneruskan argumen tunggal ke sort (), yang harus berupa array batasan atau hanya satu batasan, dan (2 ) execFind () hilang, dan sebagai gantinya diganti dengan exec (). Oleh karena itu, dengan luwak 3.8.1 Anda akan melakukan ini:

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

atau Anda dapat menyatukannya seperti itu:

models.Post
  .find({published: true})
  .sort({'date': -1})
  .limit(20)
  .exec(function(err, posts) {
       // `posts` will be of length 20
  });
marni
sumber
apa artinya {'date': -1}? Terima kasih sebelumnya!
kurumkan
3
@ArslArsl - hasil akan diurutkan berdasarkan tanggal dalam urutan menurun.
NL Long
@ArslArsl itu mirip dengan berikut: { date: 'desc' } {date: 'descending'}. Lihat jawaban
rotimi-best
Apakah ada batas maksimum?
lukas_o
20

Seperti ini, menggunakan .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.dll
sumber
2
Terima kasih banyak, tidak tahu Anda bisa membuat pertanyaan seperti itu. Di mana saya dapat menemukan beberapa bentuk dokumentasi tentang metode execFind ini?
Running Turtle
Sejujurnya, saya hanya melihat contoh di sumber dan barang luwak, serta kasus uji. Milisnya juga bagus. Dokumen yang sebenarnya tampak agak ketinggalan zaman.
kcbanner
1
apakah execFind masih dalam versi terbaru mongoosejs?
Manny
2
@Nny Itu tidak. Lihat jawaban marni untuk versi terbaru.
JohnnyHK
15

Saya agak malas, jadi saya suka hal-hal sederhana:

let users = await Users.find({}, null, {limit: 50});
Kode
sumber
8
models.Post.find({published: true}, {sort: {'date': -1}, limit: 20}, function(err, posts) {
 // `posts` with sorted length of 20
});
Suhail Ahmed
sumber
5
Meskipun cuplikan kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan tentang bagaimana dan mengapa ini menyelesaikan masalah akan sangat membantu meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, bukan hanya orang yang bertanya sekarang! Harap edit jawaban Anda untuk menambahkan penjelasan, dan berikan indikasi batasan dan asumsi apa yang berlaku.
Toby Speight
2

Temukan parameter

Parameter find function yang dibutuhkan adalah sebagai berikut:

  1. kondisi «Object».
  2. [proyeksi] «Object|String»bidang opsional untuk dikembalikan, lihat Query.prototype.select ()
  3. [opsi] «Object»opsional, lihat Query.prototype.setOptions ()
  4. [panggilan balik] «Function»

Bagaimana membatasi

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

Informasi tambahan

Mongoose memungkinkan Anda untuk menanyakan koleksi Anda dengan berbagai cara seperti: Dokumentasi Resmi

// 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-terbaik
sumber
1

Untuk beberapa alasan saya tidak dapat membuat ini bekerja dengan jawaban yang diusulkan, tetapi saya menemukan variasi lain, menggunakan pilih, yang berhasil untuk saya:

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

Apakah api mungkin berubah? Saya menggunakan versi 3.8.19

TGH
sumber
1

... selain itu pastikan untuk menggunakan:

mongoose.Promise = Promise;

Ini menetapkan janji luwak ke janji ES6 asli. Tanpa tambahan ini saya mendapat:

DeprecationWarning: Mongoose: mpromise (library promise default mongoose) tidak digunakan lagi, colokkan library promise Anda sendiri sebagai gantinya: http://mongoosejs.com/docs/promises.html

Schmalitz
sumber