Các tài liệu được lưu trữ theo thứ tự tự nhiên
Các tài liệu được lưu trữ theo thứ tự giảm dần dựa trên ngày tháng. Vì vậy, bộ sưu tập có 20140731 là tài liệu đầu tiên.
Trừ khi bạn đang sử dụng bộ sưu tập có giới hạn, không có gì đảm bảo cho việc sắp xếp các tài liệu trên đĩa (còn được gọi là thứ tự tự nhiên).
Việc xóa và di chuyển tài liệu (khi tài liệu lớn hơn không gian bản ghi được phân bổ của nó) tạo ra không gian trên danh sách miễn phí sẽ được sử dụng lại.
Đây là một ví dụ nhanh sẽ chứng minh điều này trong mongo
vỏ:
// Start with an empty database & collection
use demodb; db.dropDatabase(); db.order.drop()
// Add some test data
for (i=0; i<1000; i++) {
db.order.insert({'i': i})
}
// Looks like insertion order! (0..9)
db.order.find({}).limit(10);
// Pause 5s for effect :)
sleep(5000);
// Remove half the entries
db.order.remove({ i: { $lt: 500 }})
// Re-add the missing entries
for (i=0; i<500; i++) {
db.order.insert({'i': i})
}
// Not the entries you expected .. space from deleted records was reused
db.order.find({}).limit(10)
// Clean up demodb
db.dropDatabase()
Thứ tự kết quả
Khi tôi sử dụng lệnh find với các bộ lọc {$ gte:20140720, $ lte:20140731}, mongodb trả về truy vấn theo thứ tự tăng dần của trường "date".
Nếu một chỉ mục được sử dụng cho một truy vấn, các tài liệu sẽ được trả về theo thứ tự chúng được tìm thấy trong chỉ mục. Bạn nên tận dụng điều này khi xây dựng các chỉ mục của mình cho các truy vấn phổ biến (xem:Sử dụng Chỉ mục để Sắp xếp Kết quả Truy vấn).
FYI, một chỉ mục đơn giản (ví dụ:trên {date:1}
) có thể được sử dụng để trả về các kết quả được sắp xếp theo thứ tự tăng dần hoặc giảm dần.
Sắp xếp theo ObjectID
Nếu bạn đang sử dụng ObjectID mặc định của MongoDB cho _id
, bạn có thể sắp xếp theo { _id: 1 }
để gần đúng thứ tự chèn kể từ 4 byte đầu tiên của ObjectID
kết hợp một dấu thời gian. Nếu bạn muốn sử dụng điều này để sắp xếp truy vấn dựa trên date
và thứ tự chèn gần đúng mà bạn sẽ đảm bảo có chỉ mục vào {date:1, _id:1}
.
Lưu ý rằng ObjectID
s thường được tạo bởi trình điều khiển ứng dụng khách, vì vậy nếu bạn bị trôi đồng hồ trên các máy chủ ứng dụng của mình (hoặc _id
được tạo một thời gian trước khi tài liệu được chèn vào) ObjectID
s có thể không phản ánh đúng "thứ tự chèn" như được thấy bởi máy chủ. Nếu độ chính xác của thứ tự chèn là rất quan trọng, thì thường có thể tạo _id
ở phía máy chủ (cách tiếp cận khác nhau tùy thuộc vào trình điều khiển).