Overview
En esta guía, puede aprender a utilizar el controlador .NET/C# para recuperar los distintos valores de un campo específico en una colección.
Dentro de una colección, diferentes documentos pueden contener distintos valores para un mismo campo. Por ejemplo, un documento en una restaurants Una colección tiene un valor borough de "Manhattan" y otra tiene un valor borough de "Queens". Con el controlador .NET/C#, puede recuperar todos los valores únicos que contiene un campo en varios documentos de una colección.
Datos de muestra
Los ejemplos de esta guía utilizan la colección sample_restaurants.restaurants de 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 controlador .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 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 Synchronous o la pestaña 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 devuelve un cursor que se puede recorrer iterativamente para acceder a cada valor del campo borough. Aunque varios documentos tengan el mismo valor en el campo borough, cada valor aparece solo una vez en los resultados.
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 cuyo valor de campo cuisine es "Italian". Seleccione 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
Puede modificar el comportamiento de los métodos Distinct() y DistinctAsync() proporcionando una instancia DistinctOptions como parámetro opcional. La siguiente tabla describe las propiedades que puede configurar en una instancia DistinctOptions:
Método | Descripción |
|---|---|
| |
| 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().
Seleccione 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 |
|---|---|---|
| Specifies the International Components for Unicode (ICU) locale. For a list of
supported locales,
see Collation Locales and Default Parameters
in the MongoDB Server Manual. If you want to use simple binary comparison, use the Collation.Simple static
property to return a Collation object with the locale set to "simple".Data Type: string |
|
| (Optional) Specifies whether to include case comparison. When this argument is true, the driver's behavior depends on the value of
the strength argument:- If strength is CollationStrength.Primary, the driver compares base
characters and case.- If strength is CollationStrength.Secondary, the driver compares base
characters, diacritics, other secondary differences, and case.- If strength is any other value, this argument is ignored.When this argument is false, the driver doesn't include case comparison at
strength level Primary or Secondary.Data Type: booleanDefault: false |
|
| (Optional) Specifies the sort order of case differences during tertiary level comparisons. Data Type: CollationCaseFirst Default: CollationCaseFirst.Off |
|
| (Optional) Specifies the level of comparison to perform, as defined in the
ICU documentation. Data Type: CollationStrength Default: CollationStrength.Tertiary |
|
| (Optional) Specifies whether the driver compares numeric strings as numbers. If this argument is true, the driver compares numeric strings as numbers.
For example, when comparing the strings "10" and "2", the driver treats the values
as 10 and 2, and finds 10 to be greater.If this argument is false or excluded, the driver compares numeric strings
as strings. For example, when comparing the strings "10" and "2", the driver
compares one character at a time. Because "1" is less than "2", the driver finds
"10" to be less than "2".For more information, see Collation Restrictions
in the MongoDB Server manual. Data Type: booleanDefault: false |
|
| (Optional) Specifies whether the driver considers whitespace and punctuation as base
characters for purposes of comparison. Data Type: CollationAlternate Default: CollationAlternate.NonIgnorable (spaces and punctuation are
considered base characters) |
|
| (Optional) Specifies which characters the driver considers ignorable when
the alternate argument is CollationAlternate.Shifted.Data Type: CollationMaxVariable Default: CollationMaxVariable.Punctuation (the driver ignores punctuation
and spaces) |
|
| (Optional) Specifies whether the driver normalizes text as needed. Most text doesn't require normalization. For more information about
normalization, see the ICU documentation. Data Type: booleanDefault: false |
|
| (Optional) Specifies whether strings containing diacritics sort from the back of the string
to the front. Data Type: booleanDefault: false |
|
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: