sql >> Database >  >> NoSQL >> MongoDB

Hoe sorteert MongoDB records als er geen sorteervolgorde is opgegeven?

Wat is de standaard sorteervolgorde als er geen is opgegeven?

De standaard interne sorteervolgorde (of natuurlijke volgorde) is een undefined uitvoeringsdetails. Het handhaven van de volgorde is extra overhead voor storage-engines en de API van MongoDB vereist geen voorspelbaarheid buiten een expliciete sort() of het speciale geval van verzamelingen met een vaste grootte en met bijbehorende gebruiksbeperkingen. Voor typische workloads is het wenselijk dat de opslagengine probeert de beschikbare vooraf toegewezen ruimte opnieuw te gebruiken en beslissingen te nemen over hoe gegevens het meest efficiënt kunnen worden opgeslagen op schijf en in het geheugen.

Zonder zoekcriteria worden de resultaten door de opslagengine in natuurlijke volgorde geretourneerd (ook wel in de volgorde waarin ze zijn gevonden ). De resultaatvolgorde kan samenvallen met de invoegvolgorde, maar dit gedrag is niet gegarandeerd en er kan niet op worden vertrouwd (afgezien van gelimiteerde verzamelingen).

Enkele voorbeelden die de (natuurlijke) opslagvolgorde kunnen beïnvloeden:

  • WiredTiger gebruikt een andere weergave van documenten op schijf dan de cache in het geheugen, dus de natuurlijke volgorde kan veranderen op basis van interne gegevensstructuren.
  • De originele MMAPv1-opslagengine (verwijderd in MongoDB 4.2) wijst recordruimte toe aan documenten op basis van opvulregels. Als een document de momenteel toegewezen recordruimte ontgroeit, wordt de documentlocatie (en natuurlijke volgorde) beïnvloed. Nieuwe documenten kunnen ook worden ingevoegd in de opslag die is gemarkeerd voor hergebruik vanwege verwijderde of verplaatste documenten.
  • Replicatie gebruikt een idempotent oplog-indeling om schrijfbewerkingen consistent toe te passen op leden van replicasets. Elk lid van de replicaset houdt lokale gegevensbestanden bij die in natuurlijke volgorde kunnen variëren, maar hetzelfde gegevensresultaat zullen hebben wanneer oplog-updates worden toegepast.

Wat als een index wordt gebruikt?

Als een index wordt gebruikt, worden documenten geretourneerd in de volgorde waarin ze zijn gevonden (wat noodzakelijkerwijs overeenkomt met de invoegvolgorde of I/O-volgorde). Als er meer dan één index wordt gebruikt, hangt de volgorde intern af van welke index het document voor het eerst heeft geïdentificeerd tijdens het ontdubbelingsproces.

Als je een voorspelbare sorteervolgorde wilt, moet je moeten voeg een expliciete sort() toe met uw zoekopdracht en hebben unieke waarden voor uw sorteersleutel.

Hoe behouden gelimiteerde collecties de invoegvolgorde?

De implementatie-uitzondering voor natuurlijke volgorde in gecapte collecties wordt afgedwongen door hun speciale gebruiksbeperkingen:documenten worden opgeslagen in invoegvolgorde, maar de bestaande documentgrootte kan niet worden vergroot en documenten kunnen niet expliciet worden verwijderd. Bestellen maakt deel uit van het afgetopte collectieontwerp dat ervoor zorgt dat de oudste documenten het eerst "verouderen".



  1. MongoDB - Toestemming geweigerd voor socket:/tmp/mongodb-27017.sock

  2. MongoDB synchroniseren via ssh

  3. UUID's gebruiken in plaats van ObjectID's in MongoDB

  4. Wat is het voordeel van het gebruik van de aangepaste backend van Gorilla-sessies?