Definición
distinctEncuentra los valores distintos para un campo específico en una única colección.
distinctDevuelve un documento que contiene una matriz de valores distintos. El documento de retorno también contiene un documento incrustado con las estadísticas de la consulta y el plan de consulta.Tip
mongoshEn, este comando también se puede ejecutar a través deldb.collection.distinct()método auxiliar.Los métodos asistente son convenientes para usuarios de
mongosh, pero es posible que no proporcionen el mismo nivel de información que los comandos de base de datos. En los casos en que no se necesite la conveniencia o se requieran campos de retorno adicionales, utiliza el comando de base de datos.
Compatibilidad
Este comando está disponible en implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Importante
Este comando tiene soporte limitado en los clústeres Flex y M0. Para obtener más información, consulta Comandos no compatibles.
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
El comando tiene la siguiente sintaxis:
db.runCommand( { distinct: "<collection>", key: "<field>", query: <query>, readConcern: <read concern document>, collation: <collation document>, comment: <any>, hint: <string or document> } )
Campos de comandos
El comando toma los siguientes campos:
Campo | Tipo | Descripción | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| string | El nombre de la colección en la que se consultarán valores distintos. | ||||||||||
| string | El campo para el que se deben devolver valores distintos. | ||||||||||
| Documento | Opcional. Una query que especifica los documentos de los cuales recuperar los valores distintos. | ||||||||||
| Documento | Opcional. Especifica el nivel de consistencia de lectura. La opción Los posibles niveles de consistencia de lectura son estos:
Para obtener más información sobre los niveles de consistencia de lectura, consulta Nivel de consistencia de lectura. | ||||||||||
| Documento | Opcional. Especifica la intercalación a utilizar para la operación. La intercalación permite a los usuarios especificar reglas propias del lenguaje para la comparación de strings, como reglas para el uso de mayúsculas y minúsculas y marcas de acento. La opción de intercalación tiene la siguiente sintaxis: Al especificar la intercalación, el campo Si no se especifica la intercalación, pero la colección tiene una intercalación por defecto (ver Si no se especifica ninguna intercalación para la colección o para las operaciones, MongoDB utiliza la comparación binaria simple usada en versiones anteriores para las comparaciones de strings. No puedes especificar varias intercalaciones para una operación. Por ejemplo, no puedes especificar diferentes intercalaciones por campo, o si realizas una búsqueda con un ordenamiento, no puedes usar una intercalación para la búsqueda y otra para el ordenamiento. | ||||||||||
| any | Opcional. Un comentario proporcionado por el usuario para adjuntar a este comando. Una vez configurado, este comentario aparece junto a los registros de este comando en las siguientes ubicaciones:
Un comentario puede ser de cualquier tipo BSON válido (string, objeto, arreglo, etc.). | ||||||||||
| string o documento | Opcional. Especifique el nombre del índice, ya sea una cadena o un documento. Si se especifica, el planificador de consultas solo considera los planes que utilizan el índice sugerido. Para más información,consulte Especificar un índice. Nuevo en la versión 7.1. |
Nota
Los resultados no deben ser mayores que el tamaño máximo de BSON. Si tus resultados exceden el tamaño máximo de BSON, utiliza la canalización de agregación para recuperar valores distintos mediante el operador $group, como se describe en Recuperar valores distintos con la pipeline de agregación.
MongoDB también proporciona el método contenedor de shelldb.collection.distinct()para el comandodistinct. Además, muchos controladores de MongoDB ofrecen un método contenedor. Consulte la documentación específica del controlador.
Comportamiento
En un clúster fragmentado, el comando puede distinct devolver documentos huérfanos.
Para colecciones de series de tiempo, el comando distinct no puede hacer un uso eficiente de los índices. En su lugar, utilice una agregación $group para agrupar documentos según valores distintos. Para obtener más detalles, consulte Limitaciones de serie de tiempo.
Campos de arreglo
Si el valor del field especificado es un arreglo, distinct considera cada elemento del arreglo como un valor separado.
Por ejemplo, si un campo tiene como valor [ 1, [1], 1 ], entonces distinct considera 1, [1], y 1 como valores separados.
A partir de MongoDB,6.0 el comando devuelve los distinct mismos resultados para colecciones y vistas cuando se utilizan matrices.
Para ver ejemplos, consulta:
Uso del índice
Cuando sea posible, las operaciones de distinct pueden utilizar índices.
Los índices también pueden cubrir operaciones distinct. Consulte Ejecutar queries cubiertos para obtener más información sobre los queries cubiertos por índices.
Transacciones
Para realizar una operación específica dentro de una transacción:
Para colecciones sin partición, puedes utilizar el método
db.collection.distinct()/el comandodistinctasí como el pipeline de agregación, con la etapa$group.Para las colecciones particionadas, no puedes usar el método
db.collection.distinct()o el comandodistinct.Para encontrar los valores distintos de una colección fragmentada, utiliza la canalización de agregación con la etapa
$groupen su lugar. Consulta la Operación distinta para obtener más detalles.
Importante
En la mayoría de los casos, una transacción distribuida incurre en un costo de rendimiento mayor que las escrituras de documentos individuales, y la disponibilidad de transacciones distribuidas no debería ser un sustituto para un diseño de esquema efectivo. Para muchos casos, el modelo de datos desnormalizado (documento incrustado y matrices) seguirá siendo óptimo para tus datos y casos de uso. Es decir, en muchos casos, modelar tus datos de forma adecuada minimizará la necesidad de transacciones distribuidas.
Para consideraciones adicionales sobre el uso de transacciones (como el límite de tiempo de ejecución y el límite de tamaño del oplog), consulta también las consideraciones de producción.
Desconexión del cliente
Si el cliente que emitió distinct se desconecta antes de que la operación se complete, MongoDB marca distinct para su terminación usando killOp.
Restricción del estado del set de réplicas
Para que se ejecuten en un nodo del set de réplicas, las operaciones distinct requieren que el nodo esté en estado PRIMARY o SECONDARY. Si el nodo se encuentra en otro estado, como STARTUP2, la operación falla.
Intercalaciones y filtros de índices
A partir de MongoDB 6.0, un filtro de índice utiliza la intercalación establecida previamente mediante el comando planCacheSetFilter.
A partir de MongoDB 8.0, utiliza la configuración del query en lugar de añadir filtros de índice. Los filtros de índices están en desuso a partir de MongoDB 8.0.
La configuración de queries tiene más funcionalidades que los filtros de índices. Además, los filtros de índice no son persistentes y no puedes crear fácilmente filtros de índice para todos los nodos del clúster. Para añadir ajustes de query y explorar ejemplos, consulta setQuerySettings.
Configuración de query
Nuevo en la versión 8.0.
Puedes utilizar la configuración de query para establecer sugerencias de índice, fijar filtros de rechazo de operación y otros campos. Los ajustes se aplican a la forma de la query en todo el clúster. El clúster retiene la configuración después del apagado.
El optimizador de query utiliza la configuración del query como entrada adicional durante la planificación del query, lo que afecta al plan seleccionado para ejecutar el query. También puedes usar la configuración del query para bloquear una forma del query.
Para añadir configuraciones de query y explorar ejemplos, consulte setQuerySettings.
Puede agregar configuraciones de consulta para los comandos,find distinct aggregate y.
La configuración de query tiene más funcionalidades y se prefiere sobre los filtros de índice en desuso.
Para remover la configuración del query, utilice removeQuerySettings. Para obtener la configuración del query, utilice una etapa de $querySettings en una canalización de agregación.
Ejemplos
Los ejemplos utilizan la colección inventory que contiene los siguientes 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" ] }
Devolver valores distintos para un campo
El siguiente ejemplo devuelve los valores distintos para el campo dept de todos los documentos en la colección inventory:
db.runCommand ( { distinct: "inventory", key: "dept" } )
El comando devuelve un documento con un campo llamado values que contiene los valores distintos dept:
{ "values" : [ "A", "B" ], "ok" : 1 }
Devolver valores únicos para un campo incrustado
El siguiente ejemplo devuelve los valores distintos del campo sku, incrustado en el campo item, de todos los documentos de la colección inventory:
db.runCommand ( { distinct: "inventory", key: "item.sku" } )
El comando devuelve un documento con un campo llamado values que contiene los valores distintos sku:
{ "values" : [ "111", "222", "333" ], "ok" : 1 }
Tip
Notación de puntos para obtener información sobre cómo acceder a campos dentro de documentos incrustados
Devolver valores únicos para un campo de arreglo
El siguiente ejemplo devuelve los valores distintos para el campo sizes de todos los documentos en la colección inventory:
db.runCommand ( { distinct: "inventory", key: "sizes" } )
El comando devuelve un documento con un campo llamado values que contiene los valores distintos sizes:
{ "values" : [ "M", "S", "L" ], "ok" : 1 }
Para obtener información sobre distinct y los campos de arreglo, consulta la sección Comportamiento.
Matrices en colecciones y vistas
A partir de MongoDB,6.0 el comando devuelve los distinct mismos resultados para colecciones y vistas cuando se utilizan matrices.
El siguiente ejemplo crea una colección llamada sensor con una matriz 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 } ] } ] )
El siguiente ejemplo crea una vista llamada sensorView de la colección sensor:
db.createView( "sensorView", "sensor", [] )
El siguiente ejemplo utiliza para devolver los valores únicos de distinct la temperatures matriz en la sensor colección:
db.sensor.distinct( "temperatures.1.value" )
El 1 en temperatures.1.value especifica el índice de la matriz temperatures.
Ejemplo de salida:
[ 4, 8, 12 ]
Ejemplo para sensorView:
db.sensorView.distinct( "temperatures.1.value" )
Ejemplo de salida:
[ 4, 8, 12 ]comenzando en MongoDB 6.0 (idéntico al resultado devuelto por la colecciónsensor).[]en versiones de MongoDB anteriores a 6.0.
Especifica la query con distinct
El siguiente ejemplo devuelve los valores únicos para el campo skue incrusta en el campo item, de los documentos cuyo dept es igual a "A":
db.runCommand ( { distinct: "inventory", key: "item.sku", query: { dept: "A"} } )
El comando devuelve un documento con un campo llamado values que contiene los valores distintos sku:
{ "values" : [ "111", "333" ], "ok" : 1 }
Especifica una intercalación
La intercalación permite a los usuarios especificar reglas propias del lenguaje para la comparación de strings, como reglas para el uso de mayúsculas y minúsculas y marcas de acento.
Una colección myColl tiene los siguientes documentos:
{ _id: 1, category: "café", status: "A" } { _id: 2, category: "cafe", status: "a" } { _id: 3, category: "cafE", status: "a" }
La siguiente operación de agregación incluye la opción de intercalación:
db.runCommand( { distinct: "myColl", key: "category", collation: { locale: "fr", strength: 1 } } )
Para obtener descripciones sobre los campos de intercalación, consulta el Documento de intercalación.
Anular el nivel de consistencia de lectura por defecto
Para anular el nivel de consistencia de lectura por defecto de "local", usa la opción readConcern.
La siguiente operación en un set de réplicas especifica un nivel de consistencia de lectura de "majority" para leer la copia más reciente de los datos confirmados como están escritos en la mayoría de los nodos.
Nota
Independientemente del nivel de consistencia de lectura, es posible que los datos más recientes de un nodo no reflejen la versión más reciente de los datos en el sistema.
db.runCommand( { distinct: "restaurants", key: "rating", query: { cuisine: "italian" }, readConcern: { level: "majority" } } )
Para asegurarte de que un solo hilo pueda leer sus propias escrituras, utiliza el nivel de consistencia de lectura "majority" y el nivel de confirmación de escritura "majority" contra el primario del set de réplicas.
Especificar un índice
Puede especificar un nombre de índice o un patrón utilizando la opción de sugerencia.
Para especificar una sugerencia basada en un nombre de índice:
db.runCommand ( { distinct: "inventory", key: "dept", hint: "sizes" } )
Para especificar una sugerencia basada en un patrón de índice:
db.runCommand ( { distinct: "inventory", key: "dept", hint: { sizes: 1 } } )