İade edilen ürünlerin sayısını nasıl sınırlayabilirim?


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

İade edilen öğeleri yalnızca eklenen en son 10 öğeyle nasıl sınırlayabilirim?

Yanıtlar:


189

En son firavun faresinde (yazarken 3.8.1), iki şeyi farklı yaparsınız: (1) sıralamak için tek bir bağımsız değişken geçirmeniz gerekir (), bu bir kısıtlama dizisi veya yalnızca bir kısıtlama olmalıdır ve (2 ) execFind () gitti ve onun yerine exec () ile değiştirildi. Bu nedenle firavun faresi 3.8.1 ile şunu yaparsınız:

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

ya da basitçe şu şekilde birbirine zincirleyebilirsiniz:

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

{'tarih': -1} ne anlama geliyor? Şimdiden teşekkürler!
kurumkan

3
@ArslArsl - sonuçlar tarihe göre azalan sırada sıralanacaktır.
NL Uzun

O Aşağıdakine benzer @ArslArsl: { date: 'desc' } {date: 'descending'}. Bu cevabı
rotimi-best

Limit için bir maksimum var mı?
lukas_o

20

Bunun gibi, .limit () kullanarak:

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

2
Çok teşekkürler, böyle sorgular yapabileceğinizi bilmiyordum. Bu execFind yöntemi hakkında bazı belge biçimlerini nerede bulabilirim?
Koşu Kaplumbağa

Dürüst olmak gerekirse, firavun farelerindeki kaynaklardaki örneklere ve test vakalarına bakıyorum. Posta listesi de iyidir. Gerçek dokümanlar biraz güncel değil gibi görünüyor.
kcbanner

1
execFind hala mongoosejs'nin son sürümünde mi?
Manny

2
@Manny Değil. Güncellenmiş bir versiyon için marni'nin cevabına bakın.
JohnnyHK

15

Biraz tembelim, bu yüzden basit şeyleri severim:

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
Bu kod parçacığı soruyu çözebilirken, sorunun nasıl ve neden çözüldüğüne dair bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya gerçekten yardımcı olacaktır . Sadece şimdi soran kişi değil, gelecekte okuyucular için soruyu cevapladığınızı unutmayın! Lütfen açıklama eklemek için cevabınızı düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğuna dair bir gösterge verin.
Toby Speight

2

Parametreleri bulun

Find fonksiyonunun aldığı parametreler aşağıdaki gibidir:

  1. koşullar «Object».
  2. [projeksiyon] «Object|String»döndürülecek isteğe bağlı alanlar, bkz. Query.prototype.select ()
  3. [seçenekler] «Object»isteğe bağlı bkz Query.prototype.setOptions ()
  4. [geri aramak] «Function»

Nasıl sınırlanır

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

Fazladan bilgi

Mongoose, koleksiyonlarınızı aşağıdaki gibi farklı şekillerde sorgulamanıza olanak tanır: Resmi Belgeler

// 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

Bazı nedenlerden dolayı bunu önerilen cevaplarla çalıştıramadım, ancak select kullanarak benim için çalışan başka bir varyasyon buldum:

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

API değişmiş olabilir mi? 3.8.19 sürümünü kullanıyorum


1

... ayrıca şunları kullandığınızdan emin olun:

mongoose.Promise = Promise;

Bu, firavun faresi vaadini yerel ES6 vaadine ayarlar. Bu ekleme olmadan aldım:

Kullanımdan Kaldırma Uyarı: Mongoose: mpromise (firavun faresinin varsayılan söz kitaplığı) kullanımdan kaldırıldı, bunun yerine kendi söz kitaplığınızı ekleyin: http://mongoosejs.com/docs/promises.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.