MongoDB không lưu trữ tài liệu trong một bộ sưu tập theo một thứ tự cụ thể. Khi sắp xếp trên một trường chứa các giá trị trùng lặp, các tài liệu chứa các giá trị đó có thể được trả về theo bất kỳ thứ tự nào.
Nếu thứ tự sắp xếp nhất quán được mong muốn, bao gồm ít nhất một trường theo loại của bạn có chứa các giá trị duy nhất. Cách dễ nhất để đảm bảo điều này là bao gồm trường
{ "_id" : 2, "name" : "Rock A Feller Bar and Grill", "borough" : "Queens" }
Mặc dù các giá trị cho
db.restaurants.aggregate(
[
{ $sort : { borough : 1 } }
]
)
1 vẫn được sắp xếp theo thứ tự bảng chữ cái, thứ tự của các tài liệu chứa các giá trị trùng lặp cho
db.restaurants.aggregate(
[
{ $sort : { borough : 1 } }
]
)
1 (nghĩa là
db.restaurants.aggregate(
[
{ $sort : { borough : 1 } }
]
)
3 và
db.restaurants.aggregate(
[
{ $sort : { borough : 1 } }
]
)
4) không giống nhau.
Để đạt được một loại nhất quán, hãy thêm một trường chứa các giá trị duy nhất độc đáo vào loại. Lệnh sau sử dụng giai đoạn $sort để sắp xếp trên cả trường
{ "_id" : 2, "name" : "Rock A Feller Bar and Grill", "borough" : "Queens" }
9 theo thứ tự giảm dần. Tên trường
db.restaurants.aggregate(
[
{ $sort : { borough : 1, _id: 1 } }
]
)
7 trong tài liệu sắp xếp bị bỏ qua bởi hệ thống truy vấn. Trong đường ống này, siêu dữ liệu
db.restaurants.aggregate(
[
{ $sort : { borough : 1, _id: 1 } }
]
)
5 không được bao gồm trong phép chiếu và không được trả lại như một phần của các tài liệu phù hợp. Xem
db.restaurants.aggregate(
[
{ $sort : { borough : 1, _id: 1 } }
]
)
9 để biết thêm thông tin.
Khi $sort đi trước
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
1 và không có giai đoạn can thiệp nào sửa đổi số lượng tài liệu, trình tối ưu hóa có thể hợp nhất
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
1 vào $sort. Điều này cho phép hoạt động $sort chỉ duy trì kết quả
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
5 hàng đầu khi nó tiến triển, trong đó
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
5 là giới hạn được chỉ định và đảm bảo rằng MongoDB chỉ cần lưu trữ các mục
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
5 trong bộ nhớ. Tối ưu hóa này vẫn được áp dụng khi
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
8 là
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
9 và các mục
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
5 vượt quá giới hạn bộ nhớ tổng hợp.$sort precedes a
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
1 and there are no intervening stages that modify the number of documents, the optimizer can coalesce the
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
1 into the $sort. This allows the $sort operation to only maintain the top
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
5 results as it progresses, where
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
5 is the specified limit, and ensures that MongoDB only needs to store
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
5 items in memory. This optimization still applies when
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
8 is
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
9 and the
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
5 items exceed the aggregation memory limit.
Tối ưu hóa có thể thay đổi giữa các bản phát hành.
$sort phải tuân theo giới hạn sử dụng bộ nhớ 100 megabyte, nhưng có thể viết các tệp tạm thời vào đĩa nếu cần thêm không gian.
Bắt đầu từ MongoDB 6.0, các giai đoạn đường ống yêu cầu hơn 100 megabyte bộ nhớ để thực hiện ghi các tệp tạm thời vào đĩa theo mặc định. Trong các Verison trước đó của MongoDB, bạn phải chuyển
Nhà điều hành $sort có thể tận dụng một chỉ mục nếu nó được sử dụng trong giai đoạn đầu tiên của đường ống hoặc nếu nó chỉ được đặt trước bởi giai đoạn $sort5.$sort operator can take advantage of an index if it's used in the first stage of a pipeline or if it's only preceeded by a $sort5 stage.
Khi bạn sử dụng $sort trên cụm Sharded, mỗi Shard sẽ sắp xếp các tài liệu kết quả của nó bằng cách sử dụng một chỉ mục có sẵn. Sau đó, $sort7 hoặc một trong những mảnh vỡ thực hiện một loại hợp nhất được phát trực tuyến.$sort on a sharded cluster, each shard sorts its result documents using an index where available. Then the $sort7 or one of the shards performs a streamed merge sort.
Mẹo
Tập hợp sắp xếp là gì?
Hoạt động này sắp xếp các tài liệu trong bộ sưu tập người dùng, theo thứ tự giảm dần theo trường độ tuổi và sau đó theo thứ tự tăng dần theo giá trị trong trường Bài viết.sorts the documents in the users collection, in descending order according by the age field and then in ascending order according to the value in the posts field.
Sự khác biệt giữa việc sử dụng tổng hợp () và find () trong MongoDB là gì?
Với tổng hợp + $ khớp, bạn có được một BSON nguyên khối lớn chứa tất cả các tài liệu phù hợp. Với tìm, bạn có một con trỏ cho tất cả các tài liệu phù hợp. Sau đó bạn có thể nhận từng tài liệu một.With find, you get a cursor to all matching documents.Then you can get each document one by one.
Tra cứu trong tập hợp cho MongoDB là gì?
$ Tra cứu thực hiện một trận đấu bình đẳng trên Localfield với Foreign Field từ các tài liệu của bộ sưu tập.Nếu một tài liệu đầu vào không chứa LocalField, thì $ Tra cứu sẽ coi trường là có giá trị null cho mục đích phù hợp.performs an equality match on the localField to the foreignField from the documents of the from collection. If an input document does not contain the localField , the $lookup treats the field as having a value of null for matching purposes.
MongoDB sử dụng thuật toán nào?
Nếu MongoDB không thể có được thứ tự sắp xếp thông qua quét chỉ mục, thì MongoDB sử dụng thuật toán sắp xếp Top-K.Thuật toán này đệm kết quả K đầu tiên (hoặc cuối cùng, tùy thuộc vào thứ tự sắp xếp) được thấy cho đến nay bởi chỉ số cơ bản hoặc truy cập thu thập.top-k sort algorithm. This algorithm buffers the first k results (or last, depending on the sort order) seen so far by the underlying index or collection access.