Overview
在本指南中,您可以了解如何使用 MongoDB .NET/C# 驱动程序以执行聚合操作。
聚合操作会对 MongoDB 集合中的数据进行处理,并返回计算结果。MongoDB 聚合框架以数据处理管道的概念为模型。文档通过一个或多个阶段组成的管道流转,该管道将文档转化为聚合结果。
要学习;了解有关.NET/ C#驱动程序支持的聚合阶段的更多信息,请参阅聚合阶段。
类比
聚合操作的功能类似于带有装配线的汽车工厂。 装配线设有配备专用工具的工位来执行特定任务。 例如,在制造汽车时,装配线从制造车架开始。 然后,当车架移动通过装配线时,每个工位都会组装一个单独的零件。 最终产品即成品汽车。
装配线代表聚合管道,各个工位代表聚合阶段,专用工具代表表达式操作符,而成品则代表聚合结果。
比较聚合与查找操作
下表列出了使用查找操作可以执行的不同任务,同时列出了使用聚合操作可以实现的任务作为对比。聚合框架提供了扩展功能,允许您转换和操作数据。
查找操作 | 聚合操作 |
|---|---|
选择要返回的特定文档 | 选择要返回的特定文档 |
服务器限制
执行聚合操作时要考虑以下限制:
返回的文档不得违反 BSON 文档大小限制(16 兆字节)。
默认情况下,管道阶段的内存限制为 100 MB。如果需要,可以通过设置传递给
Aggregate()方法的AggregateOptions对象的 AllowDiskUse 属性来超出此限制。
故障排除
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 手册。