ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Docs 菜单

检索不同字段值

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

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

本指南中的示例使用来自 Atlas 示例数据集sample_restaurants.restaurants 集合。要了解如何创建免费的 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; }
}

要检索指定字段的非重复值,请调用 IMongoCollection<TDocument>实例的 Distinct()DistinctAsync() 方法,并传递要查找其非重复值的字段的名称。

以下示例检索 restaurants集合中 borough字段的非重复值。 选择 AsynchronousSynchronous标签页以查看相应的代码。

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() 方法提供查询过滤,以在集合的文档子集中查找不同的字段值。查询过滤是一个表达式,用于指定在操作中匹配文档的搜索条件。 有关创建查询过滤的更多信息,请参阅“指定查询”指南。

以下示例检索 cuisine字段值为 "Italian" 的所有文档的 borough字段的非重复值。 选择 AsynchronousSynchronous标签页以查看相应的代码。

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

Sets the collation to use for the operation.
Data type: Collation

MaxTime

Sets the maximum amount of time that the operation can run.
Data type: TimeSpan

Comment

Attaches a comment to the operation.
Data type: BsonValue or string

以下示例检索 borough字段值为 "Bronx"cuisine字段值为 "Pizza" 的所有文档的 name字段的非重复值。 然后,它通过为 Distinct() 方法提供 DistinctOptions实例来为操作添加注释。

选择 AsynchronousSynchronous 标签页,查看相应的代码。

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 文档: