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 un restaurants la colección tiene un valor borough de "Manhattan", y otra tiene un valor borough de "Queens". Al utilizar el controlador .NET/C#, puedes recuperar todos los valores únicos que un campo contiene en varios documentos dentro de una colección.
Datos de muestra
Los ejemplos en esta guía utilizan la colección sample_restaurants.restaurants de la 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 Inicio rápido.
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 específico, llame al método Distinct() o DistinctAsync() de una instancia IMongoCollection<TDocument> y pase el nombre del campo para el cual desea encontrar valores distintos.
Recuperar valores en una colección
El siguiente ejemplo recupera los valores distintos del campo borough en la colección restaurants. Seleccione el Asynchronous o la pestaña Synchronous para ver el código correspondiente.
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
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
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
Puede proporcionar un filtro de query a los métodos Distinct() y DistinctAsync() para encontrar valores de campo distintos dentro de 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 coincidencias de documentos en una operación. Para obtener más información sobre cómo crear un filtro de query, consulta la guía Especificar una 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 Asynchronous o Synchronous para ver el código correspondiente.
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
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
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 |
|---|---|
| Sets the collation to use for the operation. Data type: Collation |
| Sets the maximum amount of time that the operation can run. Data type: TimeSpan |
| Attaches a comment to the operation. Data type: BsonValue or string |
El siguiente ejemplo recupera los valores distintos del campo name para todos los documentos cuyo valor de campo borough es "Bronx" y cuyo valor de campo cuisine es "Pizza". A continuación, añade un comentario a la operación proporcionando una instancia DistinctOptions al método Distinct().
Selecciona la pestaña Asynchronous o Synchronous 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 = 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 ...
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 ...
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: