Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

distinct (comando de base de datos)

distinct

Encuentra los valores distintos para un campo especificado dentro de una sola colección. Devuelve un documento que contiene un arreglo de valores distintos y un documento incrustado que contiene estadísticas de queries y el plan del query.

Este comando está disponible en implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente administrado para implementaciones de MongoDB en la nube.

Importante

Este comando tiene soporte limitado en clústeres M0 y Flex. Para obtener más información, consulte 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.

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>,
querySettings: <document> // Added in MongoDB 9.0,
maxTimeMS: <integer>
}
)

El comando toma los siguientes campos:

Campo
Tipo
Descripción

distinct

string

El nombre de la colección en la que se va a query valores distintos.

key

string

El campo para el que se deben devolver valores distintos.

query

Documento

Opcional. Una query que especifica los documentos de los cuales recuperar los valores distintos.

readConcern

Documento

Opcional. Especifica el nivel de consistencia de lectura.

La opción readConcern tiene la siguiente sintaxis: readConcern: { level: <value> }

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.

collation

Documento

Opcional.

Opcional. Especifica la intercalación que se debe 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:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

Al especificar la intercalación, el campo locale es obligatorio; todos los demás campos de intercalación son opcionales. Para las descripciones de los campos, consulta Documento de intercalación.

Si no se especifica la intercalación, pero la colección tiene una intercalación por defecto (ver db.createCollection()), la operación utiliza la intercalación especificada para la colección.

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.

comment

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.).

hint

string o documento

Opcional. Especifique el nombre del índice, ya sea como cadena de texto o como documento. Si se especifica, el planificador de consultas solo considerará los planes que utilicen el índice sugerido. Para obtener más información,consulte Especificar un índice.

Nuevo en la versión 7.1.

querySettings

Documento

Opcional. Ajustes de query que se aplican solo a esta ejecución del comando. El documento querySettings acepta los siguientes campos:

  • indexHints

  • queryFramework

  • reject

  • comment

  • queryKnobs

  • maxTimeMS

Para las descripciones de estos campos, consulta Campos de comando.

MongoDB no almacena estos ajustes en el clúster, y no se aplican a otros query con la misma forma del query. Para establecer la configuración del query que persisten para una forma del query, utilice setQuerySettings.

MongoDB combina la configuración que pasa en el comando con cualquier configuración de query almacenada en el clúster para la misma forma del query. Si ambas configuraciones especifican el mismo campo, la configuración de clúster almacenada tiene prioridad.

Nuevo en la versión 9.0.

maxTimeMS

non-negative integer

Opcional.

Especifica un límite de tiempo en milisegundos. Si no especifica un valor para maxTimeMS, las operaciones no agotarán el tiempo de espera. Un valor de 0 especifica explícitamente el comportamiento por defecto sin límites.

MongoDB finaliza las operaciones que exceden su límite de tiempo asignado utilizando el mismo mecanismo que db.killOp(). MongoDB solo termina una operación en uno de sus puntos de interrupción designados.

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.

Para el método equivalente mongosh, consulte db.collection.distinct(). Para los métodos de envoltura específicos del controlador, consulte la documentación del controlador.

En un clúster fragmentado, el comando distinct puede 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.

Si el valor del field especificado es una matriz, distinct considera cada elemento de la matriz 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 distinct devuelve los mismos resultados para colecciones y vistas cuando se utilizan matrices.

Para ver ejemplos, consulta:

Cuando sea posible, las operacionesdistinct pueden usar índices.

Los índices también pueden abarcar operaciones distinct. Consulte Ejecutar consultas cubiertas para obtener más información sobre las consultas cubiertas por índices.

Para realizar una operación específica dentro de una transacción:

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.

Si el cliente que emitió distinct se desconecta antes de que la operación finalice, MongoDB marca distinct para su terminación usando killOp.

Para ejecutarse en un miembro del conjunto de réplicas, las operacionesdistinct requieren que el miembro esté en estado PRIMARY oSECONDARY. Si el miembro está en otro estado, como STARTUP2, la operación genera un error.

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.

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.

Puedes agregar configuraciones de consulta para los comandos find, distinct y aggregate.

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.

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" ] }

El siguiente ejemplo devuelve valores dept distintos de la colección inventory:

db.runCommand ( { distinct: "inventory", key: "dept" } )

El comando devuelve un documento con un campo values que contiene los valores dept distintos:

{
"values" : [ "A", "B" ],
"ok" : 1
}

El siguiente ejemplo devuelve valores distintos para el campo incrustado item.sku de la colección inventory:

db.runCommand ( { distinct: "inventory", key: "item.sku" } )

El comando devuelve un documento con un campo values que contiene los valores sku distintos:

{
"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

El siguiente ejemplo devuelve valores sizes distintos de la colección inventory:

db.runCommand ( { distinct: "inventory", key: "sizes" } )

El comando devuelve un documento con un campo values que contiene los valores sizes distintos:

{
"values" : [ "M", "S", "L" ],
"ok" : 1
}

Para obtener información sobre distinct y los campos de matriz, consulte la sección Comportamiento.

A partir de MongoDB 6.0, el comando distinct devuelve los mismos resultados para colecciones y vistas cuando se utilizan matrices.

El siguiente ejemplo crea una colección llamada sensor con un arreglo 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 a partir de la colección sensor:

db.createView( "sensorView", "sensor", [] )

El siguiente ejemplo utiliza distinct para devolver los valores únicos del array temperatures en la colección sensor:

db.sensor.distinct( "temperatures.1.value" )

El 1 en temperatures.1.value especifica el índice de arreglo temperatures.

Ejemplo de salida:

[ 4, 8, 12 ]

Ejemplo para sensorView:

db.sensorView.distinct( "temperatures.1.value" )

Ejemplo de salida:

  • [ 4, 8, 12 ] a partir de MongoDB 6.0 (idéntico al resultado devuelto desde la colección sensor).

  • [] en versiones de MongoDB anteriores a la 6.0.

El siguiente ejemplo devuelve valores distintos para el campo item.sku incrustado donde dept es igual a "A":

db.runCommand ( { distinct: "inventory", key: "item.sku", query: { dept: "A"} } )

El comando devuelve un documento con un campo values que contiene los valores sku distintos:

{
"values" : [ "111", "333" ],
"ok" : 1
}

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 de MongoDB:

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.

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.

Puedes especificar un nombre de índice o un patrón utilizando la opción de sugerencia.

Para especificar una sugerencia basada en el nombre de un í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 } } )