Definición
db.collection.distinct(field, query, options)MongoDB con controladores
Esta página es un documento sobre un método
mongosh. Para ver el método equivalente en un driver de MongoDB, se debe consultar la página correspondiente al lenguaje de programación:Encuentra los valores distintos para un campo especificado en una única colección o vista, y devuelve los resultados únicos en un arreglo.
Compatibilidad
Este método está disponible en implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Nota
Este comando es compatible con todos los clústeres de MongoDB Atlas. Para obtener información sobre el soporte de Atlas para todos los comandos, 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.
Sintaxis
Este método toma los siguientes parámetros:
Parameter | Tipo | Descripción |
|---|---|---|
| string | El campo para el que se deben devolver valores distintos. |
| Documento | Una query que especifica los documentos de los cuales recuperar los valores distintos. |
| Documento | Opcional. Un documento que especifica las opciones. Consulte Opciones. |
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.
El siguiente diagrama muestra un ejemplo de llamada db.collection.distinct().
opciones
{ collation: <document> }
Campo | Tipo | Descripción | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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. |
Comportamiento
En un clúster particionado, 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.
Campos de arreglo
Si el valor del field especificado es un arreglo, db.collection.distinct() considera cada elemento del arreglo como un valor separado.
Por ejemplo, si un campo tiene como valor [ 1, [1], 1 ], entonces db.collection.distinct() considera 1, [1], y 1 como valores separados.
Para ver un ejemplo, consulte Devolver valores únicos para un campo de arreglo.
Uso del índice
Cuando sea posible, las operaciones de db.collection.distinct() pueden utilizar índices.
Los índices también pueden cubrir operaciones db.collection.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 no fragmentadas, puedes utilizar el método
db.collection.distinct()o el comandodistinct, así como la canalización de agregación con la etapa$group.Para colecciones particionadas, no puede utilizar el método
db.collection.distinct()ni 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ó db.collection.distinct() se desconecta antes de que la operación se complete, MongoDB marca db.collection.distinct() para su terminación usando killOp.
Restricción del estado del set de réplicas
Para que se ejecuten en un set de réplicas, las operaciones de distinct requieren que el nodo esté en estado PRIMARY o SECONDARY. Si el nodo se encuentra en otro estado, como STARTUP2, se produce un error en la operación.
Ejemplos
Los ejemplos utilizan la colección inventory que contiene los siguientes documentos:
db.inventory.insertMany( [ { _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.inventory.distinct( "dept" )
El método devuelve el siguiente arreglo de valores únicos de dept:
[ "A", "B" ]
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.inventory.distinct( "item.sku" )
El método devuelve el siguiente arreglo de valores únicos de sku:
[ "111", "222", "333" ]
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.inventory.distinct( "sizes" )
El método devuelve el siguiente arreglo de valores únicos de sizes:
[ "M", "S", "L" ]
Para obtener información sobre distinct() y los campos de arreglo, consulta la sección Comportamiento.
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.inventory.distinct( "item.sku", { dept: "A" } )
El método devuelve el siguiente arreglo de valores únicos de sku:
[ "111", "333" ]
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:
db.myColl.insertMany( [ { _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.myColl.distinct( "category", {}, { collation: { locale: "fr", strength: 1 } } )
Para obtener descripciones sobre los campos de intercalación, consulta el Documento de intercalación.