sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur sorterar MongoDB poster när ingen sorteringsordning är angiven?

Vad är standardsorteringsordningen när ingen anges?

Standardinre sorteringsordning (eller naturlig ordning) är odefinierad genomförande detalj. Att upprätthålla ordning är extra omkostnader för lagringsmotorer och MongoDB:s API kräver inte förutsägbarhet utanför en explicit sort() eller det speciella fallet med samlingar med tak med fast storlek som har tillhörande användningsbegränsningar. För typiska arbetsbelastningar är det önskvärt för lagringsmotorn att försöka återanvända tillgängligt förallokerat utrymme och fatta beslut om hur man mest effektivt lagrar data på disk och i minne.

Utan några frågekriterier kommer resultaten att returneras av lagringsmotorn i naturlig ordning (aka i den ordning de hittas ). Resultatordning kan sammanfalla med insättningsordning men detta beteende är inte garanterat och kan inte litas på (förutom begränsade samlingar).

Några exempel som kan påverka lagringsordningen (naturlig):

  • WiredTiger använder en annan representation av dokument på disk jämfört med cacheminnet i minnet, så naturlig ordning kan ändras baserat på interna datastrukturer.
  • Den ursprungliga MMAPv1-lagringsmotorn (borttagen i MongoDB 4.2) tilldelar postutrymme för dokument baserat på utfyllnadsregler. Om ett dokument växer ur det för närvarande tilldelade postutrymmet, kommer dokumentets placering (och naturlig ordning) att påverkas. Nya dokument kan också infogas i lagringsutrymme som är markerat som tillgängliga för återanvändning på grund av raderade eller flyttade dokument.
  • Replikering använder ett idempotent oplogformat för att tillämpa skrivoperationer konsekvent över replikuppsättningsmedlemmar. Varje replikuppsättningsmedlem upprätthåller lokala datafiler som kan variera i naturlig ordning, men som kommer att få samma dataresultat när oploguppdateringar tillämpas.

Vad händer om ett index används?

Om ett index används kommer dokumenten att returneras i den ordning de hittas (vilket nödvändigtvis matchar insättningsordningen eller I/O-ordningen). Om mer än ett index används beror beställningen internt på vilket index som först identifierade dokumentet under de-dupliceringsprocessen.

Om du vill ha en förutsägbar sorteringsordning måste du inkludera en explicit sort() med din fråga och har unika värden för din sorteringsnyckel.

Hur bibehåller begränsade samlingar insättningsordningen?

Implementeringsundantaget som noterats för naturlig ordning i samlingar med tak upprätthålls av deras speciella användningsbegränsningar:dokument lagras i insättningsordning men befintlig dokumentstorlek kan inte ökas och dokument kan inte explicit raderas. Beställning är en del av den begränsade samlingsdesignen som säkerställer att de äldsta dokumenten "åldras" först.



  1. Åtkomst redis lokalt på docker - docker compose

  2. MongoDB $split

  3. Mongodb Aggregation Framework | Gruppera över flera värden?

  4. Hur man hanterar användar- och socketpar med node.js + redis