Dokumenty są przechowywane w naturalnej kolejności
Dokumenty są przechowywane w porządku malejącym według daty. Tak więc kolekcja ma 20140731 jako pierwszy dokument.
O ile nie korzystasz z kolekcji ograniczonej, nie ma gwarancji na uporządkowanie dokumentów na dysku (określane również jako porządek naturalny).
Usunięcie i przeniesienie dokumentu (gdy dokument przekroczy przydzieloną mu przestrzeń do zapisu) tworzy miejsce na wolnej liście, które zostanie ponownie wykorzystane.
Oto krótki przykład, który powinien to zademonstrować w mongo
powłoka:
// 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()
Kolejność wyników
Kiedy używam polecenia find z filtrami {$gte :20140720, $lte :20140731}, mongodb zwraca zapytanie w kolejności rosnącej pola „data”.
Jeśli w zapytaniu używany jest indeks, dokumenty są zwracane w kolejności, w jakiej zostały znalezione w indeksie. Powinieneś skorzystać z tego podczas konstruowania indeksów dla typowych zapytań (patrz:Użyj indeksów do sortowania wyników zapytań).
FYI, prosty indeks (np. {date:1}
) może służyć do zwracania wyników posortowanych w kolejności rosnącej lub malejącej.
Sortuj według identyfikatora obiektu
Jeśli używasz domyślnych identyfikatorów ObjectID MongoDB dla _id
, możesz sortować według { _id: 1 }
aby przybliżyć kolejność reklamową od pierwszych 4 bajtów ObjectID
zawierać znacznik czasu. Jeśli chcesz użyć tego do sortowania zapytania na podstawie date
i przybliżoną kolejność reklamową zapewnisz indeks w dniu {date:1, _id:1}
.
Zwróć uwagę, że ObjectID
s są zwykle generowane przez sterownik klienta, więc jeśli masz przesunięcie zegara na serwerach aplikacji (lub _id
jest tworzony jakiś czas przed wstawieniem dokumentu) ObjectID
s mogą nie odzwierciedlać ściśle „kolejności wstawiania” widzianej przez serwer. Jeśli dokładność zamówienia reklamowego jest bardzo ważna, zazwyczaj można wygenerować _id
po stronie serwera (podejście różni się w zależności od sterownika).