İ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.