Qual é a ordem de classificação padrão quando nenhuma é especificada?
A ordem de classificação interna padrão (ou ordem natural) é uma indefinida detalhe de implementação. Manter a ordem é uma sobrecarga extra para mecanismos de armazenamento e a API do MongoDB não exige previsibilidade fora de um
sort()
explícito ou o caso especial de coleções limitadas de tamanho fixo que possuem restrições de uso associadas. Para cargas de trabalho típicas, é desejável que o mecanismo de armazenamento tente reutilizar o espaço pré-alocado disponível e tomar decisões sobre como armazenar dados com mais eficiência no disco e na memória. Sem nenhum critério de consulta, os resultados serão retornados pelo mecanismo de armazenamento em ordem natural (também conhecido como na ordem em que são encontrados ). A ordem do resultado pode coincidir com a ordem de inserção, mas esse comportamento não é garantido e não pode ser confiável (exceto coleções limitadas).
Alguns exemplos que podem afetar a ordem de armazenamento (natural):
- O WiredTiger usa uma representação diferente de documentos no disco versus o cache na memória, portanto, a ordem natural pode mudar com base nas estruturas de dados internas.
- O mecanismo de armazenamento MMAPv1 original (removido no MongoDB 4.2) aloca espaço de registro para documentos com base em regras de preenchimento. Se um documento ultrapassar o espaço de registro atualmente alocado, a localização do documento (e a ordenação natural) serão afetadas. Novos documentos também podem ser inseridos no armazenamento marcados como disponíveis para reutilização devido a documentos excluídos ou movidos.
- A replicação usa um formato oplog idempotente para aplicar operações de gravação de forma consistente entre os membros do conjunto de réplicas. Cada membro do conjunto de réplicas mantém arquivos de dados locais que podem variar em ordem natural, mas terão o mesmo resultado de dados quando as atualizações do oplog forem aplicadas.
E se for usado um índice?
Se um índice for usado, os documentos serão retornados na ordem em que forem encontrados (o que necessariamente corresponde à ordem de inserção ou ordem de E/S). Se mais de um índice for usado, a ordem dependerá internamente de qual índice primeiro identificou o documento durante o processo de eliminação de duplicação.
Se você deseja uma ordem de classificação previsível, precisa inclua um
sort()
explícito com sua consulta e ter valores exclusivos para sua chave de classificação. Como as coleções limitadas mantêm o pedido de inserção?
A exceção de implementação observada para ordem natural em coleções limitadas é imposta por suas restrições especiais de uso:os documentos são armazenados na ordem de inserção, mas o tamanho do documento existente não pode ser aumentado e os documentos não podem ser excluídos explicitamente. O pedido faz parte do design de coleção com tampa que garante que os documentos mais antigos "acabem envelhecendo" primeiro.