Làm cách nào để giới hạn số lượng hàng trả lại?


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

Làm cách nào để giới hạn các mặt hàng bị trả lại chỉ trong 10 mặt hàng mới nhất đã được chèn vào?

Câu trả lời:


188

Trong mongoose mới nhất (3.8.1 tại thời điểm viết bài), bạn làm hai điều khác nhau: (1) bạn phải truyền một đối số duy nhất cho sort (), phải là một mảng các ràng buộc hoặc chỉ một ràng buộc, và (2 ) executeFind () đã biến mất và thay vào đó là thi hành (). Do đó, với mongoose 3.8.1, bạn sẽ làm điều này:

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

hoặc bạn có thể xâu chuỗi nó lại với nhau đơn giản như vậy:

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

{'date': -1} nghĩa là gì? Cảm ơn trước!
kurumkan,

3
@ArslArsl - kết quả sẽ được sắp xếp theo ngày theo thứ tự giảm dần.
NL Long

@ArslArsl nó là tương tự như sau: { date: 'desc' } {date: 'descending'}. Xem câu trả lời
rotimi-best

Có tối đa cho giới hạn không?
lukas_o

20

Như thế này, sử dụng .limit ():

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

2
Cảm ơn rất nhiều, không biết bạn có thể thực hiện các truy vấn như vậy. Tôi có thể tìm thấy một số dạng tài liệu về phương thức executeFind này ở đâu?
Running Turtle

Thành thật mà nói, tôi chỉ xem xét các ví dụ trong các nguồn và nội dung mongoose, cũng như các trường hợp thử nghiệm. Danh sách gửi thư cũng tốt. Các tài liệu thực tế có vẻ hơi lỗi thời.
kcbanner

1
ExecFind có còn trong phiên bản mongoosejs mới nhất không?
Manny

2
@Manny Nó không phải. Xem câu trả lời của marni để biết phiên bản cập nhật.
JohnnyHK

15

Tôi hơi lười biếng, vì vậy tôi thích những thứ đơn giản:

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
Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm giải thích về cách thứclý do tại sao đoạn mã này giải quyết được vấn đề sẽ thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, chứ không chỉ người hỏi bây giờ! Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những giới hạn và giả định nào được áp dụng.
Toby Speight

2

Tìm thông số

Hàm tìm tham số nhận như sau:

  1. các điều kiện «Object».
  2. [chiếu] «Object|String»các trường tùy chọn để trả về, xem Query.prototype.select ()
  3. [options] «Object»tùy chọn xem Query.prototype.setOptions ()
  4. [gọi lại] «Function»

Làm thế nào để hạn chế

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

Thông tin thêm

Mongoose cho phép bạn truy vấn bộ sưu tập của mình theo nhiều cách khác nhau như: Tài liệu chính thức

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

Vì một số lý do, tôi không thể làm cho điều này hoạt động với các câu trả lời được đề xuất, nhưng tôi đã tìm thấy một biến thể khác, sử dụng select, phù hợp với tôi:

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

Có lẽ api đã thay đổi? Tôi đang sử dụng phiên bản 3.8.19


1

... ngoài ra, hãy đảm bảo sử dụng:

mongoose.Promise = Promise;

Điều này đặt hứa hẹn mongoose thành hứa hẹn ES6 bản địa. Nếu không có phần bổ sung này, tôi nhận được:

DeprecationCảnh báo: Mongoose: mpromise (thư viện lời hứa mặc định của mongoose) không được dùng nữa, thay vào đó hãy cắm vào thư viện lời hứa của riêng bạn: http://mongoosejs.com/docs/promises.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.