Uncategorized

MongoDB: Sắp xếp kết quả truy vấn

MongoDB: Sắp xếp kết quả truy vấn

| |

Trong MongoDB, Chúng ta có thể sắp xếp kết quả truy vấn sử dụng phương thức sort().

Phương thức sort() được sử dụng ngay phía sau db.collection.find().

Khi sử dụng sort(), chúng ta sẽ thêm các tham số để làm cơ sở cho việc sắp xếp. Tham số này thuộc kiểu JSON và có thể chứa nhiều hơn 1 trường (field), mỗi trường sẽ mang giá trị là 1 hoặc -1 (ascending or descending).

Ví dụ

Đầu tiên chúng ta sẽ thực hiện truy vấn mà không sử dụng sort()

Không dùng sort()

db.director.find()

Kết quả:

{_id: 1, name: "Steven Spielberg", age: 72, children: 6}
{_id: 2, name: "Christopher Nolan", age: 49, children: 4}
{ _id: 3, name: "Quentin Tarantino", age: 56, children: 0}
{ _id: 4, name: "Jane Campion", age: 65, children: 2}
{ _id: 5, name: "David Fincher", age: 57, children: 1}
{ _id: 6, name: "Peter Jackson", age: 57, children: 2}
{ _id: 7, name: "Michael Bay", age: 54, children: 0}
{ _id: 8, name: "Ron Howard", age: 65, children: 4}

Sử dụng sort()  sắp xếp tăng dần

Khi trong tham số có trường mang giá trị bằng 1, kết quả trả ra sẽ được sắp xếp tăng dần theo trường đó:

db.director.find().sort( { age: 1 })

Bên trên, chúng ta đang sắp xếp kết quả theo thứ tự tăng dần của trường age:

{_id: 2, name: "Christopher Nolan", age: 49, children: 4}
{ _id: 7, name: "Michael Bay", age: 54, children: 0}
{ _id: 3, name: "Quentin Tarantino", age: 56, children: 0}
{ _id: 5, name: "David Fincher", age: 57, children: 1}
{ _id: 6, name: "Peter Jackson", age: 57, children: 2}
{ _id: 4, name: "Jane Campion", age: 65, children: 2}
{ _id: 8, name: "Ron Howard", age: 65, children: 4}
{_id: 1, name: "Steven Spielberg", age: 72, children: 6}

Sử dụng sort() sắp xếp giảm dần

Tương tự như trên, -1 sẽ cho kết quả giảm dần:

db.director.find().sort( { age: -1 })

Kết quả:

{_id: 1, name: "Steven Spielberg", age: 72, children: 6}
{ _id: 8, name: "Ron Howard", age: 65, children: 4}
{ _id: 4, name: "Jane Campion", age: 65, children: 2}
{ _id: 5, name: "David Fincher", age: 57, children: 1}
{ _id: 6, name: "Peter Jackson", age: 57, children: 2}
{ _id: 3, name: "Quentin Tarantino", age: 56, children: 0}
{ _id: 7, name: "Michael Bay", age: 54, children: 0}
{_id: 2, name: "Christopher Nolan", age: 49, children: 4}

Sắp xếp với nhiều trường (Multiple Fields)

Để sắp xếp sử dụng nhiều trường, chỉ cần phân tách chúng bằng đấu ‘,’. Khi làm như vậy, kết quả sẽ được sắp xếp bởi trường đứng đầu, sau đó đến các trường phía sau,cứ thế theo thứ tự lần lượt.

Ở ví dụ dưới đây, chúng ta sẽ sort theo trường age và children, nếu hai hoặc nhiều director có cùng độ tuổi (age) thì số con cái (children )sẽ quyết định đến thứ tự sắp xếp:

db.director.find().sort( { age: 1, children: 1 } )

Kết quả:

{_id: 2, name: "Christopher Nolan", age: 49, children: 4}
{ _id: 7, name: "Michael Bay", age: 54, children: 0}
{ _id: 3, name: "Quentin Tarantino", age: 56, children: 0}
{ _id: 5, name: "David Fincher", age: 57, children: 1}
{ _id: 6, name: "Peter Jackson", age: 57, children: 2}
{ _id: 4, name: "Jane Campion", age: 65, children: 2}
{ _id: 8, name: "Ron Howard", age: 65, children: 4}
{_id: 1, name: "Steven Spielberg", age: 72, children: 6}

Chúng ta cùng xem thêm ví dụ tiếp theo để hiểu rõ hơn về ảnh hưởng của trường thứ 2 (children) đến thứ tự kết quả:

db.director.find().sort( { age: 1, children: -1 } )

Kết quả:

{_id: 2, name: "Christopher Nolan", age: 49, children: 4}
{ _id: 7, name: "Michael Bay", age: 54, children: 0}
{ _id: 3, name: "Quentin Tarantino", age: 56, children: 0}
{ _id: 6, name: "Peter Jackson", age: 57, children: 2}
{ _id: 5, name: "David Fincher", age: 57, children: 1}
{ _id: 8, name: "Ron Howard", age: 65, children: 4}
{ _id: 4, name: "Jane Campion", age: 65, children: 2}
{_id: 1, name: "Steven Spielberg", age: 72, children: 6}

Sắp xếp và giới hạn

Chúng ta cũng có thể sử dụng đồng thời cả sort()limit() trong cùng một câu lệnh:

db.director.find().limit(4).sort( { age: 1, children: 1 } )

Kết quả:

{_id: 2, name: "Christopher Nolan", age: 49, children: 4}
{ _id: 7, name: "Michael Bay", age: 54, children: 0}
{ _id: 3, name: "Quentin Tarantino", age: 56, children: 0}
{ _id: 5, name: "David Fincher", age: 57, children: 1}

Tham khảo: https://docs.mongodb.com/manual/reference/bson-type-comparison-order/ để hiểu thêm về cách so sánh kiểu trong MongoDB.

 

    Previous

    MongoDB: Giới hạn kết quả truy vấn

    MongoDB: Tạo mối quan hệ

    Next

    Leave a Comment

    Subscribe

    A lead capture sample form