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
In
mongosh, this command can also be run through thedb.collection.distinct()helper method.Helper methods are convenient for
mongoshusers, but they may not return the same level of information as database commands. In cases where the convenience is not needed or the additional return fields are required, use the database command.
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 has limited support 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
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.
For the equivalent mongosh method, see db.collection.distinct(). For driver-specific wrapper methods, see the driver documentation.
Comportamento
In a sharded cluster, the distinct command may return orphaned documents.
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
If the value of the specified field is an array, distinct considers each element of the array as a separate value.
For instance, if a field has as its value [ 1, [1], 1 ], then distinct considers 1, [1], and 1 as separate values.
Starting in MongoDB 6.0, the distinct command returns the same results for collections and views when using arrays.
Para exemplos, consulte:
Uso do Ăndice
When possible, distinct operations can use indexes.
Indexes can also cover distinct operations. See Run Covered Queries for more information on queries covered by indexes.
Transações
Para realizar uma operação distinta dentro de uma transação:
For unsharded collections, you can use the
db.collection.distinct()method/thedistinctcommand as well as the aggregation pipeline with the$groupstage.For sharded collections, you cannot use the
db.collection.distinct()method or thedistinctcommand.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
If the client that issued distinct disconnects before the operation completes, MongoDB marks distinct for termination using killOp.
Restrição de estado do membro do conjunto de réplica
To run on a replica set member, distinct operations require the member to be in PRIMARY or SECONDARY state. If the member is in another state, such as STARTUP2, the operation errors.
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 }
For information on distinct and array fields, see the Behavior section.
Arrays em collections e visualizações
Starting in MongoDB 6.0, the distinct command returns the same results for collections and views when using 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", [] )
The following example uses distinct to return the unique values from the temperatures array in the 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.