2012-07-22 6 views
60

Kiedy uruchamiamy zapytanie find() Mongo bez określonej kolejności sortowania, co baza danych używa wewnętrznie do sortowania wyników?W jaki sposób MongoDB sortuje rekordy, gdy nie określono kolejności sortowania?

Według documentation on the mongo website:

Podczas wykonywania find() bez parametrów, baza danych zwraca obiektów w przód celu naturalnego.

W przypadku stołów standardowych zamówienie naturalne nie jest szczególnie użyteczne, ponieważ, , chociaż zamówienie jest często zbliżone do zamówienia reklamowego, nie jest gwarantowane, że jest to . Jednak w przypadku kolekcji z korkami zamówienie naturalne to gwarantowane jako zamówienie reklamowe. To może być bardzo przydatne.

W przypadku standardowych kolekcji (kolekcje bez limitów), jakie pole jest używane do sortowania wyników? Czy jest to pole _id lub coś innego?

Edit:

Zasadniczo myślę, co próbuję dostać się na to, że jeśli mogę wykonać następujące wyszukiwarki zapytanie:

db.collection.find({"x":y}).skip(10000).limit(1000); 

w dwóch różnych punktach w czasie: t1 i t2, czy otrzymam różne zestawy wyników:

  1. Kiedy nie było żadnych dodatkowych zapisów między t1 & t2?
  2. Kiedy pojawiły się nowe zapisy między t1 & t2?
  3. Istnieją nowe indeksy, które zostały dodane między t1 & t2?

mam przeprowadzić kilka testów na bazie temp a wyniki Dostałem są takie same (Tak) dla wszystkich 3 przypadkach - ale chciałem mieć pewność, i jestem pewien, że moje przypadki testowe weren jest bardzo dokładny.

Odpowiedz

66

Z definicji domyślnie sortowany jest domyślny , podobnie jak kolejność zwracanych dokumentów. Jeśli nie ma zapytań, użyjemy natural order. Wyniki są zwracane w zamówieniu , w którym zostały znalezione, co może pokrywać się z zamówieniem reklamowym (ale nie gwarantuje się, że tak jest) lub kolejnością używanych indeksu.

kilka przykładów, które będą miały wpływ na przechowywanie (naturalny) zamówienie:

  • jeśli dokumenty są aktualizowane i nie mieści się w ich aktualnie przydzielonego miejsca, zostaną one przeniesione
  • nowe dokumenty mogą być umieszczane w dostępnych luki utworzone przez usunięte lub przeniesione dokumenty

Jeśli używany jest indeks, dokumenty zostaną zwrócone w kolejności, w jakiej zostały znalezione. Jeżeli więcej niż jeden indeks jest używany wtedy kolejność zależy wewnętrznie, na której po raz pierwszy zidentyfikowany wskaźnik dokument podczas procesu deduplikacji.

Jeśli chcesz zamówić konkretne zamówienie, wtedy musi zawierać sortowanie z zapytaniem.

Wyjątkiem zauważyć capped collections' natural order dokumenty, ponieważ nie może się poruszać i są zapisywane w kolejności wprowadzania. Kolejność jest częścią funkcji zbierania pułapek, która zapewnia, że ​​najstarsze dokumenty są "starsze". Dodatkowo, dokumenty nie może być usunięty lub przeniesiony w zakorkowanej kolekcji (patrz Usage and Restrictions aby uzyskać więcej informacji).

+3

Więc to oznacza, że ​​jeśli uruchomię ten sam znaleźć polecenie: db.collection.find ({ "x": y}). SKIP (20000) .limit (1000) w dwóch różnych punktach w czasie, będę uzyskać różne zestawy wyników? Co się stanie, jeśli nie ma zapisów między tymi dwoma poleceniami? – saurabhj

+4

@saurabhj: Dodano kilka przykładów, które będą miały wpływ na naturalny porządek. Jeśli dokumenty zostały przeniesione/usunięte, możesz uzyskać różne zestawy wyników. Jeśli nie było żadnych insertów/aktualizacji/usunięć dokumentów, powinieneś uzyskać ten sam wynik. Dodawanie indeksów nie wpływa na lokalizację dokumentów na dysku. – Stennie

+4

Należy również dodać zastrzeżenie, że jeśli używasz [replikację] (http://www.mongodb.org/display/DOCS/Replication) naturalna kolejność może wahać się między członkami zestawu replik. – Stennie

3

Jest zwracany w przechowywanej kolejności (kolejność w pliku), ale nie można zagwarantować, że znajdują się we wprowadzonym zamówieniu. Nie są one sortowane przez pole _id. Czasami może wyglądać tak, jakby był sortowany według zamówienia reklamowego, ale może się zmienić w innym żądaniu. To nie jest niezawodne.

Powiązane problemy