Qual é a ordem de classificação padrão quando nenhuma é especificada?
A ordem de classificação interna padrão (ou ordem natural ) é um detalhe de implementação indefinido . Manter a ordem é uma sobrecarga extra para os mecanismos de armazenamento e a API do MongoDB não exige previsibilidade fora de um caso explícito sort()
ou especial de coleções limitadas de tamanho fixo que têm 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 tome decisões sobre como armazenar dados de forma mais eficiente no disco e na memória.
Sem nenhum critério de consulta, os resultados serão retornados pelo mecanismo de armazenamento em ordem natural (ou seja, na ordem em que são encontrados ). A ordem dos resultados 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 (natural) de armazenamento:
- O WiredTiger usa uma representação diferente de documentos no disco em comparação com 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 ordem natural) serão afetadas. Novos documentos também podem ser inseridos no armazenamento marcado como disponível para reutilização devido a documentos excluídos ou movidos.
- A replicação usa um formato de oplog idempotente para aplicar operações de gravação de forma consistente nos 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 de oplog forem aplicadas.
E se um índice for usado?
Se um índice for usado, os documentos serão retornados na ordem em que foram encontrados (o que necessariamente corresponde ao pedido de inserção ou ordem de E / S). Se mais de um índice for usado, a ordem dependerá internamente de qual índice identificou o documento pela primeira vez durante o processo de eliminação de duplicação.
Se desejar uma ordem de classificação previsível, você deve incluir um explícito sort()
em sua consulta e ter valores exclusivos para sua chave de classificação.
Como as coleções limitadas mantêm a ordem de inserção?
A exceção de implementação observada para a ordem natural em coleções limitadas é reforçada 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 explicitamente excluídos. O pedido é parte do design da coleção limitada que garante que os documentos mais antigos "envelheçam" primeiro.