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

Ordine del documento di restituzione di Mongodb find

I documenti sono archiviati in ordine naturale

I documenti vengono archiviati in ordine decrescente in base alla data. Quindi la collezione ha 20140731 come primo documento.

A meno che tu non stia utilizzando una raccolta limitata, non vi è alcuna garanzia per l'ordinamento dei documenti su disco (denominato anche ordine naturale).

Le eliminazioni e gli spostamenti di documenti (quando un documento supera lo spazio di registrazione allocato) creano spazio nell'elenco libero che verrà riutilizzato.

Ecco un rapido esempio che dovrebbe dimostrarlo nel mongo guscio:

// 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()

Ordine dei risultati

Quando utilizzo il comando trova con i filtri {$gte :20140720, $lte :20140731}, mongodb restituisce la query in ordine crescente del campo "data".

Se viene utilizzato un indice per una query, i documenti vengono restituiti nell'ordine in cui si trovano nell'indice. Dovresti trarne vantaggio quando costruisci i tuoi indici per query comuni (vedi:Usa gli indici per ordinare i risultati delle query).

Cordiali saluti, un semplice indice (ad es. su {date:1} ) può essere utilizzato per restituire i risultati in ordine crescente o decrescente.

Ordina per ObjectID

Se stai utilizzando gli ObjectID predefiniti di MongoDB per _id , puoi ordinare per { _id: 1 } per approssimare l'ordine di inserimento dai primi 4 byte dell'ObjectID incorporare un timestamp. Se si desidera utilizzarlo per ordinare una query in base a date e l'ordine di inserzione approssimativo garantiresti un indice su {date:1, _id:1} .

Nota che ObjectID Le s sono in genere generate dal driver client, quindi se hai una variazione dell'orologio sui tuoi server delle app (o il _id viene creato un po' di tempo prima dell'inserimento del documento) il ObjectID s potrebbe non riflettere rigorosamente l'"ordine di inserimento" visto dal server. Se la precisione dell'ordine di inserzione è molto importante, è generalmente possibile generare il _id lato server (l'approccio varia a seconda del driver).