sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan sorterer MongoDB poster, når der ikke er angivet nogen sorteringsrækkefølge?

Hvad er standardsorteringsrækkefølgen, når ingen er angivet?

Standard intern sorteringsrækkefølge (eller naturlig rækkefølge) er en udefineret implementeringsdetaljer. Vedligeholdelse af orden er ekstra overhead for storage-motorer, og MongoDB's API kræver ikke forudsigelighed uden for en eksplicit sort() eller det særlige tilfælde af samlinger med fast størrelse, som har tilhørende brugsbegrænsninger. For typiske arbejdsbelastninger er det ønskeligt, at lagermotoren forsøger at genbruge tilgængelig forudtildelt plads og træffe beslutninger om, hvordan man mest effektivt gemmer data på disk og i hukommelse.

Uden forespørgselskriterier vil resultaterne blive returneret af lagringsmotoren i naturlig rækkefølge (alias i den rækkefølge, de findes ). Resultatrækkefølgen kan falde sammen med indsættelsesrækkefølgen, men denne adfærd er ikke garanteret og kan ikke stoles på (bortset fra begrænsede samlinger).

Nogle eksempler, der kan påvirke opbevaring (naturlig) rækkefølge:

  • WiredTiger bruger en anden repræsentation af dokumenter på disk i forhold til cachen i hukommelsen, så naturlig rækkefølge kan ændre sig baseret på interne datastrukturer.
  • Den originale MMAPv1-lagringsmotor (fjernet i MongoDB 4.2) tildeler registreringsplads til dokumenter baseret på udfyldningsregler. Hvis et dokument vokser ud af den aktuelt tildelte postplads, vil dokumentets placering (og den naturlige rækkefølge) blive påvirket. Nye dokumenter kan også indsættes i lageret markeret som tilgængelige til genbrug på grund af slettede eller flyttede dokumenter.
  • Replikering bruger et idempotent oplog-format til at anvende skriveoperationer konsekvent på tværs af replikasætmedlemmer. Hvert replikasæt-medlem vedligeholder lokale datafiler, der kan variere i naturlig rækkefølge, men vil have det samme dataresultat, når oplog-opdateringer anvendes.

Hvad hvis der bruges et indeks?

Hvis der bruges et indeks, vil dokumenter blive returneret i den rækkefølge, de er fundet (hvilket nødvendigvis stemmer overens med indsættelsesrækkefølgen eller I/O-rækkefølgen). Hvis der bruges mere end ét indeks, afhænger rækkefølgen internt af, hvilket indeks, der først identificerede dokumentet under de-duplikeringsprocessen.

Hvis du vil have en forudsigelig sorteringsrækkefølge, skal du inkludere en eksplicit sort() med din forespørgsel og har unikke værdier for din sorteringsnøgle.

Hvordan opretholder begrænsede samlinger indsættelsesrækkefølgen?

Implementeringsundtagelsen, der er noteret for naturlig rækkefølge i begrænsede samlinger, håndhæves af deres særlige brugsbegrænsninger:dokumenter gemmes i indsættelsesrækkefølge, men eksisterende dokumentstørrelse kan ikke øges, og dokumenter kan ikke eksplicit slettes. Bestilling er en del af det lukkede samlingsdesign, der sikrer, at de ældste dokumenter "ældes" først.



  1. jackson deserialiser objekt med liste over forårets grænseflade

  2. MongoDB:kontroller forbindelsen til DB

  3. PyMongo -- cursor iteration

  4. Eksporter resultatet af mongodb-aggregationsramme til en ny samling