Definição
Novidades na versão 8.0.
setQuerySettings define as configurações de query usadas pelos comandos find, distinct e aggregate .
Você pode usar configurações de query para adicionar dicas de índice, definir filtros de rejeção de operação e definir outros campos para todas as execuções de uma determinada forma de query em um cluster. As configurações de query de um cluster persistem entre reinicializações.
O otimizador de query usa as configurações de query como um input adicional durante o planejamento de query. As dicas de índice nas configurações de query restringem o conjunto de índices disponíveis para o planejador, mas não garantem que o planejador usará o índice. O planejador ainda pode selecionar uma varredura de coleção como o plano vencedor para um determinado hash de forma de query.
As configurações de query de cluster têm precedência sobre as configurações de query ou dicas de índice passadas como um campo de comando . O MongoDB ignora dicas de índice em campos de comando se uma configuração de query correspondente já contiver dicas de índice.
As dicas de índice não afetam a forma de query.
For more information about hints and query settings, see Query Settings Syntax.
Observação
Para remover as configurações de query, use removeQuerySettings. Para ver as configurações de consulta atuais, use um estágio $querySettings em um pipeline de agregação.
Configurações de query e filtros de índice
A partir do MongoDB 8.0, os filtros de índice estão obsoletos. Em vez disso, use as configurações de query.
As configurações de query têm mais funcionalidades do que os filtros de índice. Os filtros de índice não são persistentes e não é possível criar facilmente filtros de índice para todos os nós do cluster.
Compatibilidade
Esse comando está disponível em implantações hospedadas nos seguintes ambientes:
- MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud
Importante
This command is not supported in M0 and Flex clusters. For more information, see Unsupported Commands.
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
Você pode adicionar ou atualizar as configurações de query usando qualquer uma das duas especificações de sintaxe mostradas nesta seção.
Definir configurações de query passando uma query
Na seguinte sintaxe, você fornece:
Um campo
$dbpara especificar o banco de dados de dados para as configurações da query.Um documento
settingscomindexHintse outros campos.
db.adminCommand( { setQuerySettings: { <fields>, // Provide fields for // find, distinct, or aggregate command $db: <string> // Provide a database name }, // Provide a settings document with indexHints and other fields settings: { indexHints: [ { ns: { db: <string>, coll: <string> }, allowedIndexes: <array> }, ... ], queryFramework: <string>, reject: <boolean>, comment: <BSON type>, queryKnobs: <document>, maxTimeMS: <non-negative integer> } } )
Definir configurações de query passando um hash de forma de query
Você pode fornecer uma string de hash de forma de query existente em setQuerySettings e um documento settings atualizado com indexHints e outros campos:
db.adminCommand( { setQuerySettings: <string>, // Provide an existing query shape hash string // Provide a settings document with indexHints and other fields settings: { indexHints: [ { ns: { db: <string>, coll: <string> }, allowedIndexes: <array> }, ... ], queryFramework: <string>, reject: <boolean>, comment: <BSON type>, queryKnobs: <document>, maxTimeMS: <non-negative integer> } } )
Um hash de forma de query é uma string que identifica exclusivamente a forma de query. Um exemplo de hash de forma de query é "F42757F1AEB68B4C5A6DE6182B29B01947C829C926BCC01226BDA4DDE799766C".
Nas versões suportadas atualmente, espera-se que a mesma forma de query produza o mesmo hash de forma de query entre nós e tipos de implantação. Para aprender como o hash se comporta entre nós, tipos de implantação e clusters, consulte Estabilidade de hash de forma de query.
Para obter a string de hash da forma de query , faça qualquer um destes:
Use um estágio
$querySettingsem um pipeline de agregação e examine o campoqueryShapeHash.Examine a saída do profiler de banco de dados de dados.
Visualize os registros de consulta lentos.
Se você definir as configurações de query usando uma string com hash, o campo representativeQuery é inicialmente ausente da saída do estágio de agregação $querySettings.
A partir do MongoDB 8.3, se a versão de compatibilidade do recurso for 8.3 ou posterior, o MongoDB preenche o campo representativeQuery para configurações de query que você define com um hash de forma de query. Quando o MongoDB executa uma query que corresponde à forma de query, ele agenda o backfill. O backfill não exige nenhuma ação de você.
O backfill é executado assincronamente na medida do possível para limitar o impacto no desempenho nas suas consultas. Uma configuração de query não tem garantia de ser preenchida retroativamente na primeira vez que uma query correspondente é executada. Se um backfill não for concluído, o MongoDB tenta novamente na próxima vez que uma query correspondente for executada.
Para armazenar as query representativas adicionais, o MongoDB 8.3 também aumenta a capacidade de armazenamento para query representativas nas configurações de query além do limite original de 16 MB de documentos BSON.
Dica
Em ambas as variações de sintaxe , você pode fornecer uma array de documentos do indexHints . Você pode omitir os colchetes da array se fornecer apenas um documento indexHints .
Campos de comando
O documento settings no comando setQuerySettings usa os seguintes campos:
Campo | tipo de campo | necessidade | Descrição |
|---|---|---|---|
| documento ou string | Obrigatório | Você pode fornecer:
|
| documento | Opcional | Namespace para dicas de índice. Obrigatório apenas quando dicas de índice opcionais são especificadas. |
| string | Condicional | Nome do banco de dados para as dicas de índice. Necessário ao especificar |
| string | Condicional | Nome da coleção para as dicas de índice. Obrigatório quando você especifica |
| array | Opcional | |
| string | Opcional | A string da estrutura de query pode ser definida como:
|
| booleano | Opcional | Se
O padrão é Para habilitar uma forma de query, execute
|
| Tipo de BSON | Opcional | Um comentário pode ser qualquer tipo de BSON válido. Por exemplo: string, objeto e assim por diante. Você pode usar um comentário para fornecer informações adicionais sobre as configurações de query. Por exemplo, para adicionar uma string que indica por que você adicionou as configurações de query, use Para atualizar um comentário, execute Você não pode remover um comentário, mas pode defini-lo como uma string com um caractere de espaço. Você pode remover as configurações de query Os comentários aparecem na Novo na versão 8.1: (e 8.0.4). |
| documento | Opcional | Um documento de Ao contrário dos outros campos
Novidades na versão 9.0. |
| non-negative integer | Opcional | Define um limite de tempo em milissegundos para execuções da forma de query. Use esta configuração para limitar uma única forma com regressão ou aumentar um tempo limite de cliente muito curto sem alterar o código do aplicativo. Se você omitir Um valor Novidades na versão 9.0. |
Controles de query
Novidades na versão 9.0.
A partir do MongoDB 9.0, você pode usar a configuração queryKnobs para substituir parâmetros internos do servidor para uma única forma de query em vez de toda a instância. Defina o campo queryKnobs para query direcionadas para mitigar o impacto de uma forma regressiva sem alterar o comportamento de outras cargas de trabalho na mesma implantação.
Por exemplo, você pode substituir o parâmetro de servidor notablescan para uma única forma de query em vez de toda a instância, definindo queryKnobs como { noTableScan: true }.
Cada controle mantém o tipo, os limites e o padrão de seu parâmetro de servidor subjacente, e setQuerySettings executa a mesma validação que setParameter executa. setQuerySettings rejeita os seguintes valores:
Knobs desconhecidos
Botões que não estão marcados como configuráveis por meio de configurações de query
BSON types incorretos
Strings de enumeração inválidas
Valores fora da faixa
Parâmetros cujo requisito mínimo de versão de compatibilidade do recurso excede a versão de compatibilidade do recurso do cluster
O valor efetivo de um parâmetro segue esta precedência, da mais alta para a mais baixa:
Conjunto de valores por forma definido com
queryKnobsValor de toda a instância definido com
setParameterValor padrão compilado
Os knobs de query fazem parte das configurações de query com hash, portanto, também fazem parte da chave de cache de plano. Se você alterar um valor de knob, o MongoDB produz uma nova chave de cache de plano, para que o planejador crie um novo plano em vez de reutilizar um plano cache obsoleto.
Ao contrário do setParameter, que se aplica por processo e pode diferir entre nós, o MongoDB aplica os mesmos valores de queryKnobs em todo o cluster para a forma de query correspondente.
Importante
Ao fazer o downgrade da versão de compatibilidade do recurso de 9.0 para uma versão anterior, uma migração atualizará as configurações de query armazenadas. A migração removerá todos os botões cuja versão de compatibilidade do recurso mínima exceda a versão de destino e excluirá qualquer entrada de configurações que ainda contenha apenas valores padrão. Fazer o upgrade novamente para 9.0 não restaurará os botões removidos. Você deve aplicá-los novamente com setQuerySettings.
Exemplos
Os exemplos a seguir criam uma coleção e adicionam configurações de consulta para comandos diferentes. Para todas as execuções de uma forma de query no cluster, os exemplos restringem o planejador de query ao uso do índice sugerido ou a uma varredura de coleção.
Criar a coleção e os índices de exemplo
Executar:
// Create pizzaOrders collection db.pizzaOrders.insertMany( [ { _id: 0, type: "pepperoni", size: "small", price: 19, totalNumber: 10, orderDate: ISODate( "2023-03-13T08:14:30Z" ) }, { _id: 1, type: "pepperoni", size: "medium", price: 20, totalNumber: 20, orderDate: ISODate( "2023-03-13T09:13:24Z" ) }, { _id: 2, type: "pepperoni", size: "large", price: 21, totalNumber: 30, orderDate: ISODate( "2023-03-17T09:22:12Z" ) }, { _id: 3, type: "cheese", size: "small", price: 12, totalNumber: 15, orderDate: ISODate( "2023-03-13T11:21:39.736Z" ) }, { _id: 4, type: "cheese", size: "medium", price: 13, totalNumber: 50, orderDate: ISODate( "2024-01-12T21:23:13.331Z" ) }, { _id: 5, type: "cheese", size: "large", price: 14, totalNumber: 10, orderDate: ISODate( "2024-01-12T05:08:13Z" ) }, { _id: 6, type: "vegan", size: "small", price: 17, totalNumber: 10, orderDate: ISODate( "2023-01-13T05:08:13Z" ) }, { _id: 7, type: "vegan", size: "medium", price: 18, totalNumber: 10, orderDate: ISODate( "2023-01-13T05:10:13Z" ) } ] ) // Create ascending index on orderDate field db.pizzaOrders.createIndex( { orderDate: 1 } ) // Create ascending index on totalNumber field db.pizzaOrders.createIndex( { totalNumber: 1 } )
Os índices têm os nomes padrão orderDate_1 e totalNumber_1.
Adicionar configurações de query para um comando de localização
O exemplo seguinte adiciona configurações de query para um comando find . O exemplo fornece campos em setQuerySettings para o comando find e inclui o índice orderDate_1 em allowedIndexes.
db.adminCommand( { setQuerySettings: { find: "pizzaOrders", filter: { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } }, sort: { totalNumber: 1 }, $db: "test" }, settings: { indexHints: { ns: { db: "test", coll: "pizzaOrders" }, allowedIndexes: [ "orderDate_1" ] }, queryFramework: "classic", comment: "Index hint for orderDate_1 index to improve query performance" } } )
(Opcional) Verifique as configurações de query
Execute este comando explain :
db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )
A seguinte saída truncada mostra que as configurações de consulta estão definidas:
queryPlanner: { winningPlan: { stage: 'SINGLE_SHARD', shards: [ { explainVersion: '1', ... namespace: 'test.pizzaOrders', indexFilterSet: false, parsedQuery: { orderDate: { '$gt': ISODate('2023-01-20T00:00:00.000Z') } }, querySettings: { indexHints: { ns: { db: 'test', coll: 'pizzaOrders' }, allowedIndexes: [ 'orderDate_1' ] }, queryFramework: 'classic', comment: 'Index hint for orderDate_1 index to improve query performance' }, ... } ... ] } }
(Opcional) Executar a query
O exemplo a seguir executa a query:
db.pizzaOrders.find( { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )
O otimizador de query usa as configurações de query como uma entrada adicional durante o planejamento de query, o que afeta o plano selecionado para executar a query.
Saída da query:
[ { _id: 0, type: 'pepperoni', size: 'small', price: 19, totalNumber: 10, orderDate: ISODate('2023-03-13T08:14:30.000Z') }, { _id: 5, type: 'cheese', size: 'large', price: 14, totalNumber: 10, orderDate: ISODate('2024-01-12T05:08:13.000Z') }, { _id: 3, type: 'cheese', size: 'small', price: 12, totalNumber: 15, orderDate: ISODate('2023-03-13T11:21:39.736Z') }, { _id: 1, type: 'pepperoni', size: 'medium', price: 20, totalNumber: 20, orderDate: ISODate('2023-03-13T09:13:24.000Z') }, { _id: 2, type: 'pepperoni', size: 'large', price: 21, totalNumber: 30, orderDate: ISODate('2023-03-17T09:22:12.000Z') }, { _id: 4, type: 'cheese', size: 'medium', price: 13, totalNumber: 50, orderDate: ISODate('2024-01-12T21:23:13.331Z') } ]
(Opcional) Obtenha as configurações de query
O exemplo a seguir utiliza um estágio $querySettings em um pipeline de agregação para obter as configurações de consulta:
db.aggregate( [ { $querySettings: {} } ] )
Saída truncada, que inclui o campo queryShapeHash :
[ { queryShapeHash: 'AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1', settings: { indexHints: [ { ns: { db: 'test', coll: 'pizzaOrders' }, allowedIndexes: [ 'orderDate_1' ] } ], queryFramework: 'classic', comment: 'Index hint for orderDate_1 index to improve query performance' }, representativeQuery: { find: 'pizzaOrders', filter: { orderDate: { '$gt': ISODate('2023-01-20T00:00:00.000Z') } }, sort: { totalNumber: 1 }, '$db': 'test' } } ]
Adicionar configurações de query para um comando distinto
O exemplo seguinte adiciona configurações de query para um comando distinct :
db.adminCommand( { setQuerySettings: { distinct: "pizzaOrders", key: "totalNumber", query: { totalNumber: 10, orderDate :{ '$gt': ISODate('2023-01-20T00:00:00.000Z') } } , $db: "test" }, settings: { indexHints: { ns: { db: "test", coll: "pizzaOrders" }, allowedIndexes: [ "orderDate_1" ] }, queryFramework: "classic", comment: "Index hint for orderDate_1 index to improve query performance" } } )
Adicionar configurações de query para um comando agregado
O exemplo a seguir adiciona configurações de query para um comando aggregate :
db.adminCommand( { setQuerySettings: { aggregate: "pizzaOrders", pipeline: [ { $match: { totalNumber: 10, orderDate :{ '$gt': ISODate('2023-01-20T00:00:00.000Z') } } }, { $group: { _id: "$type", totalMediumPizzaOrdersGroupedByType: { $sum: "$totalNumber" } } } ], $db: "test" }, settings: { indexHints: { ns: { db: "test", coll: "pizzaOrders" }, allowedIndexes: [ "totalNumber_1" ] }, queryFramework: "classic", comment: "Index hint for totalNumber_1 index to improve query performance" } } )