MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

2 cách để giới hạn tài liệu được trả lại trong MongoDB

Khi bạn chạy truy vấn Trong MongoDB, bạn có tùy chọn giới hạn các tài liệu được trả về. Đây là nơi bạn chỉ định số lượng tài liệu tối đa sẽ được trả về bởi hoạt động.

Ví dụ:nếu một thao tác thông thường sẽ trả về 2.000 tài liệu, nhưng bạn chỉ định giới hạn 1.000, thì chỉ 1.000 tài liệu được trả lại. Tuy nhiên, nếu thao tác chỉ trả về 500 tài liệu, thì tất cả 500 tài liệu sẽ được trả về (vì chúng không vi phạm giới hạn 1.000 tài liệu).

Điều này hơi giống với việc sử dụng TOP mệnh đề trong SQL Server hoặc LIMIT mệnh đề trong MySQL, MariaDB, PostgreSQL và SQLite.

Hạn chế các tài liệu được trả lại có thể giúp cải thiện hiệu suất bằng cách ngăn nhiều tài liệu được trả lại và xử lý hơn mức cần thiết.

Trong MongoDB, chúng ta có thể sử dụng cursor.limit() hoặc $limit toán tử tổng hợp để hạn chế các tài liệu bị trả lại.

cursor.limit() Phương pháp

Giả sử chúng ta có một bộ sưu tập có tên là pets với các tài liệu sau:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 }
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }

Chúng tôi có thể sử dụng limit() để giới hạn số lượng tài liệu được trả về khi truy vấn bộ sưu tập này.

Ví dụ:

db.pets.find().limit(3)

Kết quả:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

$limit Toán tử tổng hợp

Khi sử dụng đường dẫn tổng hợp, bạn có thể sử dụng $limit toán tử tổng hợp để giới hạn kết quả được chuyển sang giai đoạn tiếp theo trong quy trình.

Ví dụ:

db.pets.aggregate([
    {
      $match: { }
    },
     { 
      $limit : 3
    }
])

Ví dụ:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

Thông thường, $match toán tử sẽ không bao gồm một tài liệu trống rỗng như chúng tôi đã có ở đây. Nó thường bao gồm một truy vấn để lọc kết quả tại phần đó của đường dẫn. Nhưng trong trường hợp này, tôi đã sử dụng một tài liệu trống để làm cho ví dụ dễ theo dõi hơn.

Vì tôi đã chuyển một tài liệu trống trong giai đoạn đầu tiên, tôi có thể chỉ làm điều này:

db.pets.aggregate([
     { 
      $limit : 3
    }
])

Dù bằng cách nào, kết quả chỉ giới hạn ở 3 tài liệu.

Khi được sử dụng trong quy trình tổng hợp, $limit nhà điều hành có thể ở đâu đó ở giữa đường ống. Nếu vậy, nó sẽ chuyển các tài liệu hạn chế sang giai đoạn tiếp theo.

Đây là một ví dụ để minh họa ý tôi muốn nói.

db.pets.aggregate([
    {
      $match: { }
    },
     { 
      $limit : 3
    },
    {
      $match: { "type": "Cat" }
    }
])

Kết quả:

{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

Chỉ có một con mèo nằm trong kết quả giới hạn (mặc dù có hai con mèo trong tài liệu gốc) nên chỉ có con mèo đó được ghép ở giai đoạn thứ ba.

Điều này khác với việc làm sau đây.

db.pets.aggregate([
    {
      $match: { "type": "Cat" }
    },
     { 
      $limit : 3
    }
])

Kết quả:

{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }

Trong trường hợp này, chúng tôi đã tìm kiếm mèo trong tài liệu gốc, sau đó giới hạn kết quả chỉ còn 3. Do chỉ có 2 con mèo, $limit không ảnh hưởng đến kết quả.

Giới hạn tài liệu được sắp xếp

Nếu bạn giới hạn kết quả sau khi sắp xếp tài liệu, thì giới hạn sẽ tính đến việc sắp xếp.

Ví dụ:

db.pets.aggregate([
    {
      $sort: { "_id": -1 }
    },
     { 
      $limit : 3
    }
])

Kết quả:

{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }

Trong trường hợp này, tôi đã sắp xếp tất cả các tài liệu theo _id của chúng trường theo thứ tự giảm dần (-1 chỉ định thứ tự giảm dần).

Đây lại là thứ tự tăng dần (giá trị 1 chỉ định thứ tự tăng dần):

db.pets.aggregate([
    {
      $sort: { "_id": 1 }
    },
     { 
      $limit : 3
    }
])

Kết quả:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

Khi giới hạn kết quả sau khi chúng đã được sắp xếp rõ ràng, hãy đảm bảo rằng thao tác sắp xếp đã sử dụng một loại ổn định.

Một sắp xếp ổn định là một thứ trả về cùng một thứ tự sắp xếp mỗi khi nó được thực hiện. Sắp xếp không ổn định mặt khác, là một thứ có thể trả về một thứ tự sắp xếp khác khi được thực hiện nhiều lần.

Để đảm bảo rằng bạn đang thực hiện một sắp xếp ổn định, hãy bao gồm ít nhất một trường trong loại của bạn có chứa các giá trị duy nhất (ví dụ:_id trường).

Thông tin thêm

Để biết thêm thông tin, hãy xem tài liệu MongoDB cho:

  • cursor.limit()
  • $limit (tổng hợp)

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách kết nối ứng dụng mongodb với Meteor MongoDB cục bộ

  2. Làm thế nào bạn có thể chỉ định thứ tự của các thuộc tính trong một đối tượng javascript cho một chỉ mục MongoDB trong node.js?

  3. Chọn dữ liệu trong đó phạm vi giữa hai trường khác nhau chứa một số nhất định

  4. Tôi có cần phải đóng kết nối một cách rõ ràng không?

  5. Cách tham gia vào hai bộ sưu tập bổ sung với các điều kiện