Definição
distinctEncontra os valores distintos para um campo especificado em uma Ăşnica coleção. Retorna um documento que contĂ©m uma array de valores distintos e um documento incorporado que contĂ©m estatĂsticas de query e o plano de query.
Dica
mongoshEm, esse comando também pode ser executado por meio do métododb.collection.distinct()assistente.Os métodos auxiliares são convenientes para os
mongoshusuários, mas podem nĂŁo retornar o mesmo nĂvel de informações que os comandos do banco de dados . Nos casos em que a conveniĂŞncia nĂŁo for necessária ou os campos de retorno adicionais forem necessários, use o comando de banco de dados.
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 tem suporte limitado nos clusters M0 e Flex. Para saber mais, 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
O comando tem a seguinte sintaxe:
db.runCommand( { distinct: "<collection>", key: "<field>", query: <query>, readConcern: <read concern document>, collation: <collation document>, comment: <any> } )
Campos de comando
O comando utiliza os seguintes campos:
Campo | Tipo | Descrição | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| string | O nome da collection para consultar valores distintos. | ||||||||||
| string | O campo para o qual retornar valores distintos. | ||||||||||
| documento | Opcional. Uma query que especifica os documentos a partir dos quais recuperar os valores distintos. | ||||||||||
| documento | Opcional. Especifica a read concern. A opção Os possĂveis nĂveis de read concern sĂŁo:
Para obter mais informações sobre os read concern, consulte NĂveis de read concern. | ||||||||||
| documento | Opcional. Opcional. Especifica a agrupamento para utilizar para a operação. A colocação permite que os usuários especifiquem regras especĂficas do idioma para comparação de strings, como regras para letras maiĂşsculas e marcas de acento. A opção de agrupamento tem a seguinte sintaxe: Ao especificar agrupamento, o campo Se o agrupamento nĂŁo for especificado, mas a coleção tiver um agrupamento padrĂŁo (consulte Se nenhum agrupamento for especificado para a coleção ou para as operações, o MongoDB usa a comparação binária simples usada nas versões anteriores para comparações de strings. VocĂŞ nĂŁo pode especificar vários agrupamentos para uma operação. Por exemplo, vocĂŞ nĂŁo pode especificar agrupamentos diferentes por campo ou, se estiver realizando uma busca com uma classificação, nĂŁo poderá usar um agrupamento para a busca e outro para a classificação. | ||||||||||
| any | Opcional. Um comentário fornecido pelo usuário para anexar a este comando. Depois de definido, esse comentário aparece junto com os registros desse comando nos seguintes locais:
Um comentário pode ser qualquer tipo BSON válido (string, inteiro, objeto, array etc). |
Observação
Os resultados não devem ser maiores do que o tamanho máximo do BSON. Se seus resultados excederem o tamanho máximo de BSON, use o pipeline de agregação para recuperar valores distintos usando o operador $group, conforme descrito em Recuperar valores distintos com o pipeline de agregação.
Para o mongosh mĂ©todo equivalente, consulte. Para db.collection.distinct() obter mĂ©todos wrapper especĂficos do driver, consulte a documentação do driver .
Comportamento
Em um cluster fragmentado, o comando pode distinct retornar documentos ĂłrfĂŁos.
Para coleções de sĂ©ries temporais, o comando distinct nĂŁo consegue fazer uso eficiente dos Ăndices. Em vez disso, use uma agregação $group para agrupar documentos por valores distintos. Para obter detalhes, consulte Limitações de sĂ©ries temporais.
Campos de array
Se o valor do especificado field for uma array, considera cada elemento da array como um valordistinct separado.
Por exemplo, se um campo tiver como seu [ 1, [1], 1 ] valor, entĂŁo distinct 1considera, [1] e 1 como valores separados.
Iniciando no MongoDB,6.0 o comando retorna os distinct mesmos resultados para collections e visualizações ao utilizar arrays.
Para exemplos, consulte:
Uso do Ăndice
Quando possĂvel, as operações do podem utilizardistinct Ăndices.
Os Ăndices tambĂ©m podem abranger distinct operações. Consulte Executar queries cobertas para obter mais informações sobre queries cobertas por Ăndices.
Transações
Para realizar uma operação distinta dentro de uma transação:
Para coleções não fragmentadas, você pode usar o
db.collection.distinct()método /odistinctcommand, bem como o pipeline de agregação com o$groupstage.Para coleções fragmentadas, você não pode utilizar o método
db.collection.distinct()distinctou o comando.Para encontrar os valores distintos de uma pipeline de agregação fragmentada, use o pipeline de agregação com o estágio
$group. Consulte Operação Distinta para detalhes.
Importante
Na maioria dos casos, uma transação distribuĂda incorre em um custo de desempenho maior do que as gravações de um Ăşnico documento, e a disponibilidade de transações distribuĂdas nĂŁo deve substituir o design eficaz do esquema. Em muitos cenários, o modelo de dados desnormalizado (documentos e arrays incorporados) continuará a ser ideal para seus dados e casos de uso. Ou seja, para muitos cenários, modelar seus dados adequadamente minimizará a necessidade de transações distribuĂdas.
Para considerações adicionais sobre o uso de transações (como limite de tempo de execução e limite de tamanho do oplog), consulte também Considerações de produção.
DesconexĂŁo do cliente
Se o cliente que emitiu distinct se desconectar antes da conclusão da operação, o MongoDB marcará para distinct encerramento killOp usando.
Restrição de estado do membro do conjunto de réplica
Para executar em um membro do conjunto de réplicas, distinct as operações do exigem que o membro esteja no estado ou.PRIMARY Se o membro estiver em SECONDARY STARTUP2 outro estado, como, os erros de operação.
Filtros e Agrupamentos de ĂŤndice
Iniciando no MongoDB 6.0, um filtro de Ăndice utiliza a coleção definida anteriormente utilizando o comando planCacheSetFilter.
Exemplos
Os exemplos utilizam a coleção inventory que contém os seguintes documentos:
{ "_id": 1, "dept": "A", "item": { "sku": "111", "color": "red" }, "sizes": [ "S", "M" ] } { "_id": 2, "dept": "A", "item": { "sku": "111", "color": "blue" }, "sizes": [ "M", "L" ] } { "_id": 3, "dept": "B", "item": { "sku": "222", "color": "blue" }, "sizes": "S" } { "_id": 4, "dept": "A", "item": { "sku": "333", "color": "black" }, "sizes": [ "S" ] }
Valores Distintos de Devolução para um Campo
O exemplo a seguir retorna valores dept distintos da coleção inventory:
db.runCommand ( { distinct: "inventory", key: "dept" } )
O comando retorna um documento com um campo values contendo os valores dept distintos:
{ "values" : [ "A", "B" ], "ok" : 1 }
Valores Distintos de Retorno para um Campo Incorporado
O exemplo a seguir retorna valores distintos para o campo incorporado item.sku da coleção inventory:
db.runCommand ( { distinct: "inventory", key: "item.sku" } )
O comando retorna um documento com um campo values contendo os valores sku distintos:
{ "values" : [ "111", "222", "333" ], "ok" : 1 }
Dica
Notação de pontos para obter informações sobre como acessar campos em documentos incorporados
Valores Distintos de Retorno para um Campo de Array
O exemplo a seguir retorna valores sizes distintos da coleção inventory:
db.runCommand ( { distinct: "inventory", key: "sizes" } )
O comando retorna um documento com um campo values contendo os valores sizes distintos:
{ "values" : [ "M", "S", "L" ], "ok" : 1 }
Para informações sobre e campos de distinct array, consulte a seção Comportamento.
Arrays em collections e visualizações
Iniciando no MongoDB,6.0 o comando retorna os distinct mesmos resultados para collections e visualizações ao utilizar arrays.
O exemplo a seguir cria uma collection chamada sensor com uma array de valores de temperatura para cada documento:
db.sensor.insertMany( [ { _id: 0, temperatures: [ { value: 1 }, { value: 4 } ] }, { _id: 1, temperatures: [ { value: 2 }, { value: 8 } ] }, { _id: 2, temperatures: [ { value: 3 }, { value: 12 } ] }, { _id: 3, temperatures: [ { value: 1 }, { value: 4 } ] } ] )
O exemplo seguinte cria uma visualização denominada sensorView a partir da collection sensor:
db.createView( "sensorView", "sensor", [] )
O exemplo a seguir usa para retornar os valores exclusivos distinct da temperatures array na sensor collection:
db.sensor.distinct( "temperatures.1.value" )
O 1 em temperatures.1.value especifica o Ăndice da array temperatures.
SaĂda de exemplo:
[ 4, 8, 12 ]
Exemplo para sensorView:
db.sensorView.distinct( "temperatures.1.value" )
SaĂda de exemplo:
[ 4, 8, 12 ]começando no MongoDB 6.0 (idêntico ao resultado retornado da collectionsensor).[]em versões MongoDB anteriores a 6.0.
Especificar query com distinct
O exemplo a seguir retorna valores distintos para o campo item.sku incorporado em que dept Ă© igual a "A":
db.runCommand ( { distinct: "inventory", key: "item.sku", query: { dept: "A"} } )
O comando retorna um documento com um campo values contendo os valores sku distintos:
{ "values" : [ "111", "333" ], "ok" : 1 }
Especificar um agrupamento
A colocação permite que os usuários especifiquem regras especĂficas do idioma para comparação de strings, como regras para letras maiĂşsculas e marcas de acento.
Uma coleção myColl possui os seguintes documentos:
{ _id: 1, category: "café", status: "A" } { _id: 2, category: "cafe", status: "a" } { _id: 3, category: "cafE", status: "a" }
A seguinte operação de aggregation inclui a opção Agrupamento:
db.runCommand( { distinct: "myColl", key: "category", collation: { locale: "fr", strength: 1 } } )
Para obter descrições sobre os campos de agrupamento, consulte Documento de agrupamento.
Substituir o Padrão Atenção com a Leitura
Para substituir o nĂvel de preocupação de leitura padrĂŁo do "local", utilize a opção readConcern.
A operação a seguir em um conjunto de réplicas especifica uma read concern de "majority" para ler a cópia mais recente dos dados confirmados como tendo sido gravados na maioria dos nós.
Observação
Independentemente do nĂvel de read concern, os dados mais recentes em um nĂł podem nĂŁo refletir a versĂŁo mais recente dos dados no sistema.
db.runCommand( { distinct: "restaurants", key: "rating", query: { cuisine: "italian" }, readConcern: { level: "majority" } } )
Para garantir que um único thread possa ler suas próprias gravações, use "majority" read concern e "majority" write concern em relação ao primário do conjunto de réplicas.