Overview
在本指南中,您可以了解如何使用 MongoDB .NET/C# 驱动程序以执行聚合操作。
聚合操作会对 MongoDB 集合中的数据进行处理,并返回计算结果。MongoDB 聚合框架以数据处理管道的概念为模型。文档通过一个或多个阶段组成的管道流转,该管道将文档转化为聚合结果。
要详细学习;了解.NET/ C#驱动程序支持的聚合阶段,请参阅 聚合阶段。
类比
聚合操作的功能类似于带有装配线的汽车工厂。 装配线设有配备专用工具的工位来执行特定任务。 例如,在制造汽车时,装配线从制造车架开始。 然后,当车架移动通过装配线时,每个工位都会组装一个单独的零件。 最终产品即成品汽车。
装配线代表聚合管道,各个工位代表聚合阶段,专用工具代表表达式操作符,而成品则代表聚合结果。
比较聚合与查找操作
下表列出了使用查找操作可以执行的不同任务,同时列出了使用聚合操作可以实现的任务作为对比。聚合框架提供了扩展功能,允许您转换和操作数据。
查找操作 | 聚合操作 |
---|---|
Select certain documents to return Select which fields to return Sort the results Limit the results Count the results | Select certain documents to return Select which fields to return Sort the results Limit the results Count the results Group the results Rename fields Compute new fields Summarize data Connect and merge data sets |
服务器限制
执行聚合操作时要考虑以下限制:
返回的文档不得违反 BSON 文档大小限制(16 兆字节)。
默认,管道阶段的内存限制为 100 MB。如有需要,您可以通过设置传递给
AggregateOptions
Aggregate()
方法的 对象的 AllowDiskUse 属性来超出此限制。
故障排除
Unsupported filter
or Expression not supported
如果使用 Query API中未提供的 LINQ 或生成器表达式,则可能会收到 Unsupported filter ...
或 Expression not
supported ...
异常消息。表达式在以下情况下可能不可用:
您尝试使用的.NET/ C#功能没有对应的MongoDB表示形式。示例, .NET/ C#和MongoDB在排序规则方面有不同的语义。
驾驶员不支持从 LINQ 或生成器表达式到 Query 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 }"));
更多信息
要查看表达式操作符的完整列表,请参阅聚合操作符。