文档菜单
文档首页
/ / /
C#/.NET
/ / /

检索唯一字段值

本页内容

  • 概述
  • 示例数据
  • 检索唯一值
  • 跨集合检索值
  • 跨指定文档检索值
  • 修改唯一行为
  • API文档

在本指南中,您可以学习如何使用.NET/C#驱动程序跨集合检索指定字段的唯一值。

在集合中,不同的文档可能包含单个字段的不同值。例如,一个在restaurants 集合中的文档有一个 borough 值为 "Manhattan",另一个文档有一个 borough 值为 "Queens"。通过使用.NET/C#驱动程序,您可以检索包含在集合中多个文档中的字段所包含的所有唯一值。

本指南中的示例使用来自Atlas 示例数据集。要了解如何创建免费的 MongoDB Atlas 集群并加载示例数据集,请参阅快速入门.

本页面上的示例使用了以下 Restaurant 类来模拟集合中的文档

public class Restaurant {
public ObjectId? Id { get; set; }
[BsonElement("name")]
public string? Name { get; set; }
[BsonElement("cuisine")]
public string? Cuisine { get; set; }
[BsonElement("borough")]
public string? Borough { get; set; }
}

要检索指定字段的唯一值,请调用 Distinct()DistinctAsync() 方法,并传递您想要找到唯一值的字段名称。

以下示例检索了 restaurants 集合中 borough 字段的唯一值。选择异步同步 选项卡查看相应的代码。

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

该操作返回一个游标,您可以通过它遍历以访问每个唯一的 borough 字段值。尽管有多个文档在 borough 字段中具有相同的值,但每个值在结果中只出现一次。

您可以为 Distinct()DistinctAsync() 方法提供一个 查询过滤器,以在集合的文档子集中找到不同的字段值。查询过滤器是一个表达式,用于指定在操作中用于匹配文档的搜索条件。有关创建查询过滤器的更多信息,请参阅指定查询指南。

以下示例检索具有 "Italian" 字段值的所有文档中 borough 字段的不同值。选择 异步同步 选项卡以查看相应的代码。

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

您可以通过提供可选参数 DistinctOptions 实例来修改 Distinct()DistinctAsync() 方法的行为。以下表格描述了您可以在 DistinctOptions 实例上设置的属性

方法
描述

Collation

MaxTime

设置操作可以运行的最大时间。
数据类型: TimeSpan

注释

将注释附加到操作。
数据类型BsonValuestring

以下示例检索所有具有 borough 字段值为 "Bronx"cuisine 字段值为 "Pizza" 的文档的 name 字段的唯一值。然后,通过将 DistinctOptions 实例提供给 Distinct() 方法,对该操作添加注释。

选择 异步同步 选项卡以查看相应的代码。

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

要了解本指南中讨论的任何方法或类型,请参阅以下 API 文档

返回

统计文档数量