sql >> Database >  >> NoSQL >> MongoDB

Mongodb vondst's terugkerende documentbestelling

Documenten worden in natuurlijke volgorde opgeslagen

De documenten worden op datum in aflopende volgorde opgeslagen. Dus de collectie heeft 20140731 als eerste document.

Tenzij u een gelimiteerde verzameling gebruikt, is er geen garantie voor het bestellen van documenten op schijf (ook wel natuurlijke volgorde genoemd).

Verwijderingen en verplaatsingen van documenten (wanneer een document de toegewezen recordruimte ontgroeit) creëren ruimte op de vrije lijst die opnieuw zal worden gebruikt.

Hier is een snel voorbeeld dat dit zou moeten aantonen in de mongo schaal:

// Start with an empty database & collection
use demodb; db.dropDatabase(); db.order.drop()

// Add some test data
for (i=0; i<1000; i++) {
    db.order.insert({'i': i})
}

// Looks like insertion order! (0..9)
db.order.find({}).limit(10);

// Pause 5s for effect :)
sleep(5000);

// Remove half the entries
db.order.remove({ i: { $lt: 500 }})

// Re-add the missing entries
for (i=0; i<500; i++) {
    db.order.insert({'i': i})
}

// Not the entries you expected .. space from deleted records was reused
db.order.find({}).limit(10)

// Clean up demodb
db.dropDatabase()

Volgorde van resultaten

Wanneer ik de opdracht find met filters {$gte:20140720, $lte:20140731} gebruik, retourneert mongodb de zoekopdracht in oplopende volgorde van het veld "datum".

Als een index wordt gebruikt voor een zoekopdracht, worden de documenten geretourneerd in de volgorde waarin ze in de index zijn gevonden. U moet hiervan profiteren bij het samenstellen van uw indexen voor veelvoorkomende zoekopdrachten (zie:Indexen gebruiken om zoekopdrachtresultaten te sorteren).

Ter info, een eenvoudige index (bijv. op {date:1} ) kan worden gebruikt om de resultaten gesorteerd in oplopende of aflopende volgorde te retourneren.

Sorteren op ObjectID

Als u MongoDB's standaard ObjectID's gebruikt voor _id , u kunt sorteren op { _id: 1 } om de invoegvolgorde te benaderen sinds de eerste 4 bytes van de ObjectID een tijdstempel opnemen. Als u dit wilt gebruiken voor het sorteren van een zoekopdracht op basis van date en geschatte invoegvolgorde zou u zorgen voor een index op {date:1, _id:1} .

Merk op dat ObjectID s worden meestal gegenereerd door het clientstuurprogramma, dus als u klokdrift op uw app-servers heeft (of de _id wordt aangemaakt enige tijd voordat het document wordt ingevoegd) de ObjectID s geven mogelijk niet strikt de "invoegvolgorde" weer zoals gezien door de server. Als de nauwkeurigheid van de invoegvolgorde erg belangrijk is, is het over het algemeen mogelijk om de _id . te genereren aan de serverzijde (aanpak varieert afhankelijk van de bestuurder).




  1. Waarom kan Travis geen verbinding maken met Redis cache_store bij implementatie naar Heroku?

  2. Clusterfailover

  3. Mongodb Mongoimport te groot:fout bij het parseren van fouten

  4. Aanbevelingen voor Redis-clientbibliotheek voor gebruik vanuit Scala