Overview
在本指南中,您可以了解如何使用 MongoDB .NET/C# 驱动程序以执行聚合操作。
聚合操作会对 MongoDB 集合中的数据进行处理,并返回计算结果。MongoDB 聚合框架以数据处理管道的概念为模型。文档通过一个或多个阶段组成的管道流转,该管道将文档转化为聚合结果。
要学习;了解有关.NET/ C#驱动程序支持的聚合阶段的更多信息,请参阅聚合阶段。
提示
完成聚合教程
You can find tutorials that provide detailed explanations of common aggregation tasks in the Complete Aggregation Pipeline Tutorials section of the Server manual. Select a tutorial, and then pick C# from the Select your language drop-down menu in the upper-right corner of the page.
类比
聚合操作的功能类似于带有装配线的汽车工厂。 装配线设有配备专用工具的工位来执行特定任务。 例如,在制造汽车时,装配线从制造车架开始。 然后,当车架移动通过装配线时,每个工位都会组装一个单独的零件。 最终产品即成品汽车。
装配线代表聚合管道,各个工位代表聚合阶段,专用工具代表表达式操作符,而成品则代表聚合结果。
比较聚合与查找操作
下表列出了使用查找操作可以执行的不同任务,同时列出了使用聚合操作可以实现的任务作为对比。聚合框架提供了扩展功能,允许您转换和操作数据。
查找操作 | 聚合操作 |
|---|---|
选择要返回的特定文档 | 选择要返回的特定文档 |
服务器限制
执行聚合操作时要考虑以下限制:
返回的文档不得违反 MB 的BSON文档大小限制。16
修改聚合行为
You can modify the behavior of the Aggregate() method by passing an AggregateOptions object.
The following table describes some AggregateOptions properties:
属性 | 说明 |
|---|---|
| 指定管道阶段是否可以将数据写入磁盘上的临时文件以超过 100 MB 内存限制。 |
| 设置服务器在每个游标批处理中返回的最大文档数。 |
| 设置用于操作的排序规则。 |
| 为操作设置注释,以便在分析器日志中更容易识别 |
| 设置服务器用于此操作的索引。 |
| 设置该操作在服务器上的最长执行时间。 |
To see a full list of available options, see AggregateOptions Properties in the API documentation.
例子
The following example runs an aggregation pipeline and sets the BatchSize property to 5:
var options = new AggregateOptions { BatchSize = 5 }; var pipeline = new EmptyPipelineDefinition<Movie>() .Match(...) .Group(...); var results = collection.Aggregate(pipeline, options);
故障排除
Unsupported filter or Expression not supported
如果使用 Query API中未提供的 LINQ 或生成器表达式,则可能会收到 Unsupported filter ... 或 Expression not supported ... 异常消息。表达式在以下情况下可能不可用:
您尝试使用的.NET/ C#功能没有对应的MongoDB表示形式。示例, .NET/ C#和MongoDB在排序规则方面有不同的语义。
驱动程序不支持从 LINQ 或构建者表达式到查询 API 的特定转换。发生这种情况的原因可能是所提供的查询没有 Query API转换,或者驱动程序中尚未实现某项功能。
如果您收到这些异常之一,请尝试执行以下步骤:
使用MongoDB C# 分析器分析表达式。
尽可能简化查询。
以
BsonDocument对象或JSON字符串的形式提供查询。 所有定义类,例如FilterDefinition、ProjectionDefinition和PipelineDefinition,都支持从BsonDocument对象或JSON字符串进行隐式转换。示例,以下筛选器在查询或聚合中使用时是等效的:FilterDefinition<Entity> typedFilter = Builders<Entity>.Filter.Eq(e => e.A, 1); FilterDefinition<Entity> bsonFilter = new BsonDocument {{ "a", 1 }}; FilterDefinition<Entity> jsonFilter = "{ a : 1 }";
您可以在同一查询中组合 BsonDocument 对象、 JSON字符串、POCO,如以下示例所示:
FilterDefinition<Entity> filter = Builders<Entity>.Filter .And(Builders<Entity>.Filter .Eq(e => e.A, 1), BsonDocument .Parse("{ b : 2 }"));
注意
如果使用 BsonDocument对象或JSON字符串,字段名称必须与服务器存储的区分大小写的名称匹配。 示例,引用 _id字段时,必须使用字段名 _id 来引用。
由于 Query API无法识别手动类映射、 BSON序列化属性或序列化约定,因此您无法使用这些机制更改字段名称。示例,如果文档包含名为 FirstName 并带有 [BsonElement("first_name")] 注释的字段,则必须在 BsonDocument 或JSON字符串定义中将其引用为 first_name。
更多信息
有关聚合阶段的完整列表,请参阅 聚合阶段,详见 MongoDB Server 手册。