O MongoDB Search permite que você configure a classificação em seu índice para pré-classificar documentos em ordem crescente ou decrescente no momento do índice, em vez de classificar no momento da query. Isso é útil quando os conjuntos de resultados são muito grandes, tornando a classificação no momento da query lenta. Você pode usar a opção de índice sort com os seguintes tipos de campo do MongoDB Search:
booleandatenumber(valores inteiros, float e double)objectIdtokenuuid
Você também pode configurar como deseja que null ou os valores ausentes sejam classificados usando a opção noData.
Sintaxe
A opção sort tem a seguinte sintaxe:
1 { 2 "mappings": { 3 "dynamic": true|false, 4 "fields": { 5 "<field-name>": { 6 "type": "boolean" | "date" | "number" | "objectId" | "token" | "uuid" 7 } 8 } 9 }, 10 "sort": { "<field-to-sort>": 1 | -1 } | { "<field-to-sort>": { "order": 1 | -1, "noData": "lowest" | "highest" } } 11 }
Requisitos
Para usar um índice classificado, você deve:
Configure os campos usados para
sortusando mapeamentos estáticos.booleandatenumber(valores inteiros, float e double)objectIdtoken(stringvalues)uuid
O MongoDB Search suporta campos que você indexa como vários tipos para
sortse pelo menos um dos tipos for um dos tipos suportados listados acima.Para classificar em campos aninhados, configure todos os campos intermediários até o campo raiz como o tipo
document.
Observação
Se você especificar a opção sort com campos que são indexados usando mapeamentos dinâmicos ou typeSet, a construção do índice falhará.
Comportamento
Um índice classificado ordena fisicamente os documentos do MongoDB Search durante as construções de índice usando a classificação de nível superior configurada em vez de classificar no momento da query. Isso melhora o desempenho de queries cuja especificação $search.sort corresponde à classificação do índice ou a um prefixo dela, especialmente ao classificar conjuntos de resultados muito grandes (como mais de um milhão de documentos nos resultados).
Use a saída explain para verificar se uma query usa a ordenação indexada. As query que se beneficiam da ordenação indexada incluem o campo usesIndexSort: true. Uma query se beneficia quando seus campos de ordenação correspondem à ordenação indexada ou a um prefixo da ordenação indexada.
Observação
Você não pode usar a metaexpressão searchScore como parte do índice classificado porque a pontuação é calculada apenas no momento da query.
Suporte a array
Você pode classificar em campos de array. O MongoDB Search nivela o array e usa um valor representativo para comparação. Para classificação crescente, ele usa o menor valor no array e para classificação decrescente, ele usa o maior valor no array.
Para arrays de tipos mistos, a ordem de classificação é baseada na ordem de comparação BSON do MongoDB. Para uma classificação ascendente, o MongoDB Search usa o elemento com o menor tipo de BSON. Para uma classificação decrescente, o MongoDB Search usa o elemento com o tipo de BSON mais alto.
Suporte a documentos incorporados
Você pode classificar em campos filho somente se todos os documentos pai estiverem definidos estaticamente como o tipo document .
As query que usam returnScope não se beneficiam do índice classificado porque a definição do índice classificado não oferece suporte ao tipo de campo embeddedDocuments no índice para classificação.
Considerações
Índices com especificações
sortpodem ter construções de índice e replicação mais lentas.Queries com
$search.sortespecificado como o inverso da ordenação indexada podem ser mais lentas em comparação com o uso de um índice não ordenado. Queries usando outras especificações$search.sortnão serão afetadas.O MongoDB Search suporta apenas uma especificação
sortpor índice. Se você quiser classificar em campos diferentes, escolha a ordem de classificação dominante como a classificação do índice.
Exemplos
Os exemplos a seguir criam um índice classificado nos campos da coleção sample_airbnb.listingsAndReviews.
A definição de índice a seguir classifica o number_of_reviews e o last_reviewed campos em ordem decrescente.
{ "mappings": { "dynamic": false, "fields": { "number_of_reviews": { "type": "number" }, "last_reviewed": { "type": "date" } } }, "sort": { "number_of_reviews": -1, "last_reviewed": -1 } }
A definição de índice a seguir classifica os campos number_of_reviews e last_reviewed em ordem decrescente. Ele coloca documentos com valores nulos ou ausentes na parte inferior dos resultados.
{ "mappings": { "dynamic": false, "fields": { "number_of_reviews": { "type": "number" }, "last_reviewed": { "type": "date" } } }, "sort": { "number_of_reviews": { "order": -1, "noData": "lowest" }, "last_reviewed": { "order": -1, "noData": "lowest" } } }
A seguinte definição de índice classifica no campo date em ordem decrescente. Para classificar no campo date, ele define o campo reviews como o tipo embeddedDocuments e o tipo document.
{ "mappings": { "dynamic": false, "fields": { "reviews": [ { "type": "embeddedDocuments", "dynamic": true }, { "type": "document", "dynamic": false, "fields": { "date": { "type": "date" } } } ] } }, "sort": { "reviews.date": -1 } }
A definição de índice a seguir classifica o campo property_type em ordem crescente com valores nulos e ausentes aparecendo na parte inferior dos resultados. O campo property_type é definido como os tipos string, autocomplete e token. O índice usa apenas o tipo token para classificação.
{ "mappings": { "dynamic": false, "fields": { "property_type": [ { "type": "string" }, { "type": "autocomplete", "tokenization": "edgeGram", "minGrams": 2, "maxGrams": 15 }, { "type": "token" } ] } }, "sort": { "property_type": { "order": 1, "noData": "highest" } } }