Jaka jest domyślna kolejność sortowania, jeśli nie została określona?
Domyślna wewnętrzna kolejność sortowania (lub naturalna kolejność ) to niezdefiniowany szczegół implementacji. Utrzymywanie porządku jest dodatkowym obciążeniem dla silników pamięci masowej, a interfejs API MongoDB nie wymaga przewidywalności poza jawnym sort()
lub specjalnym przypadkiem zbiorów o ustalonych limitach, które mają powiązane ograniczenia użytkowania . W przypadku typowych obciążeń pożądane jest, aby silnik pamięci masowej próbował ponownie wykorzystać dostępne wstępnie przydzielone miejsce i podejmował decyzje dotyczące najbardziej wydajnego przechowywania danych na dysku iw pamięci.
Bez kryteriów zapytania, wyniki zostaną zwrócone przez mechanizm przechowywania w naturalnej kolejności (czyli w kolejności, w jakiej zostały znalezione ). Kolejność wyników może pokrywać się z zamówieniem reklamowym, ale to zachowanie nie jest gwarantowane i nie można na nim polegać (poza kolekcjami ograniczonymi).
Kilka przykładów, które mogą wpływać na porządek przechowywania (naturalny):
- WiredTiger używa innej reprezentacji dokumentów na dysku niż w pamięci podręcznej, więc naturalna kolejność może się zmieniać w oparciu o wewnętrzne struktury danych.
- Oryginalny silnik pamięci MMAPv1 (usunięty w MongoDB 4.2) przydziela miejsce na rekordy dla dokumentów na podstawie reguł dopełniania. Jeśli dokument wykroczy poza aktualnie przydzielone miejsce na nagrania, wpłynie to na lokalizację dokumentu (i naturalną kolejność). Nowe dokumenty mogą być również umieszczane w magazynie oznaczonym jako dostępne do ponownego wykorzystania z powodu usuniętych lub przeniesionych dokumentów.
- Replikacja używa idempotentnego formatu oplog , aby konsekwentnie stosować operacje zapisu na elementach zestawu replik. Każdy członek zestawu replik przechowuje lokalne pliki danych, które mogą się różnić w naturalnej kolejności, ale będą miały taki sam wynik po zastosowaniu aktualizacji oplog.
A jeśli używany jest indeks?
Jeśli używany jest indeks, dokumenty zostaną zwrócone w kolejności, w jakiej zostały znalezione (co musi być zgodne z kolejnością wstawiania lub kolejnością we / wy). Jeśli używany jest więcej niż jeden indeks, kolejność zależy wewnętrznie od tego, który indeks jako pierwszy zidentyfikował dokument podczas procesu deduplikacji.
Jeśli chcesz mieć przewidywalną kolejność sortowania, musisz dołączyć jawne sort()
zapytanie i mieć unikalne wartości dla klucza sortowania.
Jak ograniczone kolekcje utrzymują kolejność reklamową?
Wyjątek implementacji odnotowany dla porządku naturalnego w kolekcjach ograniczonych jest wymuszany przez ich specjalne ograniczenia użytkowania: dokumenty są przechowywane w kolejności wstawienia, ale istniejącego rozmiaru dokumentu nie można zwiększyć, a dokumentów nie można jawnie usunąć. Zamawianie jest częścią ograniczonego projektu kolekcji, który zapewnia, że najstarsze dokumenty „starzeją się” jako pierwsze.
{createdAt: -1}
) Jest konieczne do zaimplementowania optymistycznych wzorców UI (aktualizowanie list danych w pamięci podręcznej bez oczekiwania na odpowiedź serwera po utworzeniu / aktualizacji / usunięciu). W przeciwnym razie nie można dopasować optymistycznej kolejności po stronie klienta i kolejności odpowiedzi serwera.Jest zwracany w kolejności zapisanej (kolejność w pliku), ale nie ma gwarancji, że znajduje się we wstawionej kolejności. Nie są sortowane według pola _id. Czasami może to wyglądać, jakby zostało posortowane według kolejności reklam, ale może się zmienić w innym żądaniu. To nie jest wiarygodne.
źródło