Thứ tự sắp xếp mặc định là gì khi không có quy định nào được chỉ định?
Thứ tự sắp xếp nội bộ mặc định (hoặc thứ tự tự nhiên) là không xác định chi tiết thực hiện. Duy trì thứ tự là chi phí bổ sung cho các công cụ lưu trữ và API của MongoDB không bắt buộc khả năng dự đoán bên ngoài sort()
rõ ràng hoặc trường hợp đặc biệt của các bộ sưu tập có giới hạn kích thước cố định có các hạn chế sử dụng liên quan. Đối với các khối lượng công việc điển hình, công cụ lưu trữ nên cố gắng sử dụng lại không gian được phân bổ trước có sẵn và đưa ra quyết định về cách lưu trữ dữ liệu trên đĩa và trong bộ nhớ một cách hiệu quả nhất.
Không có bất kỳ tiêu chí truy vấn nào, kết quả sẽ được công cụ lưu trữ trả về theo thứ tự tự nhiên (còn gọi là theo thứ tự tìm thấy chúng ). Thứ tự kết quả có thể trùng với thứ tự chèn nhưng hành vi này không được đảm bảo và không thể dựa vào (ngoài các tập hợp có giới hạn).
Một số ví dụ có thể ảnh hưởng đến thứ tự lưu trữ (tự nhiên):
- WiredTiger sử dụng cách trình bày tài liệu trên đĩa khác với bộ nhớ đệm trong bộ nhớ, vì vậy thứ tự tự nhiên có thể thay đổi dựa trên cấu trúc dữ liệu bên trong.
- Công cụ lưu trữ MMAPv1 ban đầu (đã bị loại bỏ trong MongoDB 4.2) phân bổ không gian bản ghi cho các tài liệu dựa trên các quy tắc đệm. Nếu một tài liệu lớn hơn không gian bản ghi được cấp phát hiện tại, vị trí tài liệu (và thứ tự tự nhiên) sẽ bị ảnh hưởng. Các tài liệu mới cũng có thể được đưa vào bộ nhớ được đánh dấu là sẵn có để sử dụng lại do tài liệu bị xóa hoặc di chuyển.
- Bản sao sử dụng định dạng oplog không thể thay đổi để áp dụng các thao tác ghi một cách nhất quán trên các thành viên tập hợp bản sao. Mỗi thành viên của nhóm bản sao duy trì các tệp dữ liệu cục bộ có thể khác nhau theo thứ tự tự nhiên, nhưng sẽ có cùng kết quả dữ liệu khi áp dụng cập nhật nhật ký.
Điều gì sẽ xảy ra nếu một chỉ mục được sử dụng?
Nếu một chỉ mục được sử dụng, các tài liệu sẽ được trả về theo thứ tự chúng được tìm thấy (nhất thiết phải khớp với thứ tự chèn hoặc thứ tự I / O). Nếu nhiều hơn một chỉ mục được sử dụng thì thứ tự phụ thuộc nội bộ vào chỉ mục nào xác định tài liệu đầu tiên trong quá trình khử trùng lặp.
Nếu bạn muốn một thứ tự sắp xếp có thể dự đoán được, bạn phải bao gồm một sort()
rõ ràng với truy vấn của bạn và có các giá trị duy nhất cho khóa sắp xếp của bạn.
Làm cách nào để các bộ sưu tập có giới hạn duy trì thứ tự chèn?
Ngoại lệ triển khai được lưu ý đối với trật tự tự nhiên trong bộ sưu tập có giới hạn được thực thi bởi các hạn chế sử dụng đặc biệt của chúng:tài liệu được lưu trữ theo thứ tự chèn nhưng không thể tăng kích thước tài liệu hiện có và không thể xóa tài liệu một cách rõ ràng. Đặt hàng là một phần của thiết kế bộ sưu tập có giới hạn nhằm đảm bảo các tài liệu cũ nhất "hết tuổi" trước.