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.
Para obter mais informações sobre dicas e configurações de query, consulte Sintaxe das configurações de query.
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: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
Importante
Esse comando não é suportado em clusters M0 e Flex. Para obter mais informações, consulte Comandos não suportados.
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 atuais suportadas, espera-se que a mesma forma de query produza o mesmo hash de forma de query entre nós e tipos de sistema. Para saber como o hash se comporta entre nós, tipos de implantação e clusters, consulte Estabilidade do 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 de hash, o campo representativeQuery estará inicialmente ausente da saída do estágio de agregação $querySettings.
A partir do MongoDB 8.3, se o FCV for 8.3 ou posterior, o MongoDB preencherá o campo representativeQuery para as configurações de query que você definiu com um hash de forma de query . Quando o MongoDB executa uma query que corresponde à forma de query, ele agenda o preenchimento. O preenchimento não exige nenhuma ação sua.
O preenchimento é executado de forma assíncrona na base do melhor esforço possível para limitar o impacto no desempenho em suas queries. Não é garantido que uma configuração de query seja preenchida na primeira vez que uma query correspondente for executada. Se um preenchimento não for concluído, o MongoDB tentará novamente da próxima vez que uma query correspondente for executada.
Para manter as queries representativas adicionais, o MongoDB 8.3 também aumenta a capacidade de armazenamento para queries representativas em configurações de query além do limite original do documento 16 MB 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 utiliza 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. Obrigatório ao especificar |
| string | Condicional | Nome da coleção para as dicas de índice. Obrigatório ao especificar |
| 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 Novidades na versão 8.1: (e 8.0.4). |
| documento | Opcional | Um documento de pares Ao contrário dos outros campos
Novidades na versão 9.0. |
| non-negative integer | Opcional | Define um limite de tempo em milésimos de segundo para execuções da forma de query. Use essa configuração para limitar uma única forma regressiva ou aumentar o tempo limite do cliente sem alterar o código do aplicação . Se você omitir Um valor Novidades na versão 9.0. |
Knobs de query
Novidades na versão 9.0.
A partir do MongoDB 9.0, você pode usar a configuração queryKnobs para substituir os parâmetros internos do servidor para uma única forma de query em vez de toda a instância. Defina o campo queryKnobs para queries direcionadas para mitigar o impacto de uma forma regredida 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 botão 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:
Botões desconhecidos
Botões que não estão marcados como configuráveis por meio de configurações de query
Tipos de BSON incorretos
Strings de enumeração inválidas
Valores fora do intervalo
Botões cujo requisito mínimo de FCV excede o FCV do cluster
O valor efetivo de um botão segue esta precedência, do mais alto para o mais baixo:
Valor por forma definido com
queryKnobsValor para toda a instância definido com
setParameterValor padrão compilado
Os botões de query fazem parte das configurações de query com hash, portanto, também fazem parte da chave de cache do plano. Se você alterar um valor de botão, o MongoDB produz uma nova chave de cache do plano, para que o planejador crie um novo plano em vez de reutilizar um plano obsoleto em cache.
Ao contrário do setParameter, que se aplica por processo e pode diferir entre os nós, o MongoDB aplica os mesmos valores queryKnobs em todo o cluster para a forma de query correspondente.
Importante
Quando você faz o downgrade do FCV de 9.0 para uma versão anterior, uma migração atualiza as configurações de query armazenadas. A migração remove todos os botões cujo FCV mínimo exceda a versão de destino e exclui qualquer entrada de configurações que ainda contenha apenas valores padrão. A atualização para 9.0 não restaura os botões removidos. Você deve reaplicá-los 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" } } )