Hoe sorteert MongoDB records als er geen sorteervolgorde is opgegeven?

Als we een Mongo find()-query uitvoeren zonder een opgegeven sorteervolgorde, wat gebruikt de database dan intern om de resultaten te sorteren?

Volgens de documentatie op de mongo-website:

Bij het uitvoeren van een find() zonder parameters, retourneert de database
objecten in voorwaartse natuurlijke volgorde.

Voor standaardtabellen is natuurlijke volgorde niet erg handig omdat,
hoewel de bestelling vaak dicht bij de invoegvolgorde ligt, is dit niet het geval
gegarandeerd zijn. Voor gecapte collecties is de natuurlijke volgorde echter:
gegarandeerd de invoegvolgorde. Dit kan erg handig zijn.

Welk veld wordt voor standaardverzamelingen (niet-afgetopte verzamelingen) gebruikt om de resultaten te sorteren?
Is het het veld _idof iets anders?

Bewerken:

Kortom, ik denk dat ik probeer te bereiken dat als ik de volgende zoekopdracht uitvoer:

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

Krijg ik op twee verschillende tijdstippen: t1en t2verschillende resultatensets:

  1. Als er geen extra schrijfbewerkingen zijn geweest tussen t1 & t2?
  2. Als er nieuwe schrijfbewerkingen zijn geweest tussen t1 & t2?
  3. Er zijn nieuwe indexen toegevoegd tussen t1 & t2?

Ik heb een aantal tests uitgevoerd op een tijdelijke database en de resultaten die ik heb gekregen zijn hetzelfde (Ja) voor alle drie de gevallen – maar ik wilde er zeker van zijn en ik ben er zeker van dat mijn test zaken waren niet erg grondig.


Antwoord 1, autoriteit 100%

Wat is de standaard sorteervolgorde als er geen is opgegeven?

De standaard interne sorteervolgorde (of natuurlijke volgorde ) is een niet gedefinieerdimplementatiedetail. Het handhaven van de orde is extra overhead voor storage-engines en MongoDB’s API vereist geen voorspelbaarheid buiten een expliciete sort()of het speciale geval van afgetopte collectieswaaraan gebruiksbeperkingen. Voor typische workloads is het wenselijk dat de opslagengine probeert de beschikbare vooraf toegewezen ruimte opnieuw te gebruiken en beslissingen te nemen over de meest efficiënte manier om gegevens op schijf en in het geheugen op te slaan.

Zonder zoekcriteria worden de resultaten geretourneerd door de opslagengine in natuurlijke volgorde(ook bekend als in de volgorde waarin ze worden 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) volgorde van de opslag 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 over replicasetleden. 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 worden gevonden (die zich noodzakelijk overeenkomt met inbrengorder of I / O-bestelling). Als er meer dan één index wordt gebruikt, hangt de bestelling intern af van welke index het document voor het eerst heeft geïdentificeerd tijdens het de-duplicatieproces.

Als u een voorspelbare sorteervolgorde wilt bestellen Must Neem een ​​expliciete sort()met uw zoekopdracht op en hebt u unieke waarden voor uw sorteerleutel.

Hoe onderhouden afgedekte collecties insertionorder?

De uitzondering van de implementatie die is opgemerkt voor natuurlijke beschikking in afgedekte collecties wordt afgedwongen door hun speciale gebruiksbeperkingen: documenten worden opgeslagen in insertionorder, maar bestaande documentgrootte kan niet worden verhoogd en documenten kunnen niet expliciet worden verwijderd. Bestellen maakt deel uit van het afgedekte collectieontwerp dat eerst de oudste documenten “Age OUT” zorgt.


Antwoord 2, Autoriteit 6%

Het wordt geretourneerd in de opgeslagen bestelling (bestelling in het bestand), maar het is niet gegarandeerd dat ze zich in de ingevoegde volgorde bevinden. Ze worden niet gesorteerd op het veld _id. Soms kan het eruit zien alsof het wordt gesorteerd op de insertion-volgorde, maar het kan in een ander verzoek veranderen. Het is niet betrouwbaar.

Other episodes