Overview
En esta guía, puedes aprender a usar el driver .NET/C# para recuperar los valores únicos de un campo específico en una colección.
Dentro de una colección, diferentes documentos pueden contener diferentes valores para un mismo campo. Por ejemplo, un documento en una colección de restaurants tiene un valor borough de "Manhattan", y otro tiene un valor borough de "Queens". Al utilizar el controlador de .NET/C#, puedes recuperar todos los valores únicos que un campo contiene en múltiples documentos dentro de una colección.
Datos de muestra
Los ejemplos en esta guía utilizan la colección sample_restaurants.restaurants de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte Introducción al driver .NET/C#.
Los ejemplos de esta página utilizan la siguiente clase Restaurant para modelar los documentos de la colección:
public class Restaurant { public ObjectId? Id { get; set; } [] public string? Name { get; set; } [] public string? Cuisine { get; set; } [] public string? Borough { get; set; } }
Retrieve Distinct Values
Para recuperar los valores distintos de un campo especificado, llama al método Distinct() o DistinctAsync() de una instancia de IMongoCollection<TDocument> y pasa el nombre del campo para el que deseas encontrar valores distintos.
Recuperar valores en una colección
El siguiente ejemplo recupera los valores distintos del campo borough en la colección restaurants. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente.
var results = collection.Distinct<string>(r => r.Borough, Builders<Restaurant>.Filters.Empty).ToList(); foreach (var result in results) { Console.WriteLine(result); }
Bronx Brooklyn Manhattan Missing Queens Staten Island
var results = await collection.DistinctAsync<string>(r => r.Borough, Builders<Restaurant>.Filters.Empty); await results.ForEachAsync(result => Console.WriteLine(result));
Bronx Brooklyn Manhattan Missing Queens Staten Island
La operación retorna un cursor que puedes recorrer para acceder a cada valor distinto del campo borough. Aunque varios documentos tienen el mismo valor en el campo borough, cada valor aparece en los resultados solo una vez.
Recuperar valores en documentos especificados
Puedes proporcionar un filtro de query a los métodos Distinct() y DistinctAsync() para encontrar valores de campos distintos en un subconjunto de documentos en una colección. Un filtro de query es una expresión que especifica los criterios de búsqueda utilizados para coincidir documentos en una operación. Para obtener más información sobre cómo crear un filtro de query, consulta la guía Crear un filtro de query .
El siguiente ejemplo recupera los valores distintos del campo borough para todos los documentos que tienen un valor de campo cuisine de "Italian". Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente.
var filter = Builders<Restaurant>.Filter.Eq(r => r.Cuisine, "Italian"); var results = collection.Distinct<string>(r => r.Borough, filter).ToList(); foreach (var result in results) { Console.WriteLine(result); }
Bronx Brooklyn Manhattan Queens Staten Island
var filter = Builders<Restaurant>.Filter.Eq(r => r.Cuisine, "Italian"); var results = await collection.DistinctAsync<string>(r => r.Borough, filter); await results.ForEachAsync(result => Console.WriteLine(result));
Bronx Brooklyn Manhattan Queens Staten Island
Modificar el comportamiento de Distinct
Puedes modificar el comportamiento de los métodos Distinct() y DistinctAsync() proporcionando una instancia de DistinctOptions como parámetro opcional. La siguiente tabla describe las propiedades que puede configurarse en una instancia DistinctOptions:
Método | Descripción |
|---|---|
| |
| Establece el tiempo máximo que puede ejecutarse la operación. |
| Adjunta un comentario a la operación. |
El siguiente ejemplo recupera los valores distintos del campo name para todos los documentos que tienen un valor de campo borough de "Bronx" y un valor de campo cuisine de "Pizza". Luego, añade un comentario a la operación proporcionando una instancia de DistinctOptions al método Distinct().
Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente.
var cuisineFilter = Builders<Restaurant>.Filter.Eq(r => r.Cuisine, "Pizza"); var boroughFilter = Builders<Restaurant>.Filter.Eq(r => r.Borough, "Bronx"); var filter = Builders<Restaurant>.Filter.And(cuisineFilter, boroughFilter); var options = new DistinctOptions { Comment = "Find all Italian restaurants in the Bronx" }; var results = collection.Distinct<string>(r => r.Name, filter).ToList(); foreach (var result in results) { Console.WriteLine(result); }
$1.25 Pizza 18 East Gunhill Pizza 2 Bros Aenos Pizza Alitalia Pizza Restaurant Amici Pizza And Pasta Angie'S Cafe Pizza ...
var cuisineFilter = Builders<Restaurant>.Filter.Eq(r => r.Cuisine, "Pizza"); var boroughFilter = Builders<Restaurant>.Filter.Eq(r => r.Borough, "Bronx"); var filter = Builders<Restaurant>.Filter.And(cuisineFilter, boroughFilter); var options = new DistinctOptions { Comment = "Find all Italian restaurants in the Bronx" }; var results = await collection.DistinctAsync<string>(r => r.Name, filter, options); await results.ForEachAsync(result => Console.WriteLine(result));
$1.25 Pizza 18 East Gunhill Pizza 2 Bros Aenos Pizza Alitalia Pizza Restaurant Amici Pizza And Pasta Angie'S Cafe Pizza ...
Intercalación
Para configurar la intercalación para tu operación, crea una instancia de la clase intercalación.
La siguiente tabla describe los parámetros que acepta el constructor Collation. También enumera la propiedad de clase correspondiente que se puede usar para leer el valor de cada configuración.
Parameter | Descripción | Propiedad de clase |
|---|---|---|
| Especifica la configuración regional de Componentes Internacionales para Unicode (ICU). Para obtener una lista de las configuraciones regionales compatibles, consulte Configuraciones regionales de intercalación y parámetros predeterminados en el Manual del servidor MongoDB. |
|
| (Opcional) Especifica si se debe incluir la comparación de mayúsculas y minúsculas. |
|
| (Opcional) Especifica el orden de clasificación de las diferencias de mayúsculas y minúsculas durante las comparaciones de nivel terciario. |
|
| (Opcional) Especifica el nivel de comparación a realizar, tal como se define en la documentación de la UCI. |
|
| (Opcional) Especifica si el controlador compara las cadenas numéricas como números. |
|
| (Opcional) Especifica si el controlador considera los espacios en blanco y la puntuación como caracteres base para fines de comparación. |
|
| (Opcional) Especifica qué caracteres considera el controlador como ignorables cuando el |
|
| (Opcional) Especifica si el controlador normaliza el texto según sea necesario. |
|
| (Opcional) Especifica si las cadenas que contienen diacríticos se ordenan desde el final de la cadena hacia el principio. |
|
Más información sobre la intercalación en la página Intercalación en el manual de MongoDB Server.
Documentación de la API
Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API: