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

In che modo MongoDB ordina i record quando non viene specificato alcun ordinamento?

Qual ​​è l'ordinamento predefinito quando non ne viene specificato nessuno?

L'ordinamento interno predefinito (o ordine naturale) è un non definito dettaglio di attuazione. Il mantenimento dell'ordine è un sovraccarico aggiuntivo per i motori di archiviazione e l'API di MongoDB non impone la prevedibilità al di fuori di un esplicito sort() o il caso speciale di raccolte limitate di dimensioni fisse che hanno restrizioni di utilizzo associate. Per i carichi di lavoro tipici è auspicabile che il motore di archiviazione tenti di riutilizzare lo spazio preallocato disponibile e di prendere decisioni su come archiviare i dati in modo più efficiente su disco e in memoria.

Senza alcun criterio di query, i risultati verranno restituiti dal motore di archiviazione in ordine naturale (ovvero nell'ordine in cui sono stati trovati ). L'ordine dei risultati può coincidere con l'ordine di inserzione, ma questo comportamento non è garantito e non è possibile fare affidamento (a parte le raccolte limitate).

Alcuni esempi che possono influire sull'ordine di archiviazione (naturale):

  • WiredTiger utilizza una rappresentazione diversa dei documenti su disco rispetto alla cache in memoria, quindi l'ordine naturale può cambiare in base alle strutture dati interne.
  • Il motore di archiviazione MMAPv1 originale (rimosso in MongoDB 4.2) alloca spazio di registrazione per i documenti in base alle regole di riempimento. Se un documento supera lo spazio di registrazione attualmente allocato, la posizione del documento (e l'ordinamento naturale) ne risentiranno. È inoltre possibile inserire nuovi documenti nella memoria contrassegnata come disponibile per il riutilizzo a causa di documenti eliminati o spostati.
  • La replica utilizza un formato oplog idempotente per applicare le operazioni di scrittura in modo coerente tra i membri del set di repliche. Ciascun membro del set di repliche conserva file di dati locali che possono variare in ordine naturale, ma avranno lo stesso risultato di dati quando vengono applicati gli aggiornamenti oplog.

E se viene utilizzato un indice?

Se viene utilizzato un indice, i documenti verranno restituiti nell'ordine in cui sono stati trovati (che corrisponde necessariamente all'ordine di inserimento o all'ordine di I/O). Se viene utilizzato più di un indice, l'ordine dipende internamente da quale indice ha identificato per primo il documento durante il processo di deduplicazione.

Se desideri un ordinamento prevedibile, devi includere un esplicito sort() con la tua query e avere valori univoci per la tua chiave di ordinamento.

In che modo le raccolte limitate mantengono l'ordine di inserzione?

L'eccezione di implementazione nota per l'ordine naturale nelle raccolte limitate è rafforzata dalle loro speciali restrizioni di utilizzo:i documenti vengono archiviati nell'ordine di inserzione ma le dimensioni del documento esistente non possono essere aumentate ei documenti non possono essere eliminati esplicitamente. L'ordine fa parte del design della raccolta limitata che garantisce che i documenti più vecchi "scadano" per primi.