Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/ / /
C#/ .NET驱动程序
/

聚合管道阶段

在此页面上,您可以学习;了解如何使用.NET/ C#驱动程序中的方法创建聚合管道和管道阶段。

您可以使用.NET/ C#驱动程序通过构建器方法或BSON文档构建聚合管道。请参阅以下部分,学习;了解有关每种方法的更多信息。

您可以通过以下方式构建类型安全的聚合管道:

  • 构造一个 EmptyPipelineDefinition<TDocument>对象。从此对象到相关聚合方法的链式调用。然后,将管道对象传递给 IMongoCollection<TDocument>.Aggregate() 方法。

  • 调用 IMongoCollection<TDocument>.Aggregate() 方法。从此方法调用到相关聚合方法的链式调用。

选择 EmptyPipelineDefinitionAggregate标签页,查看每种方法对应的代码:

// Defines the aggregation pipeline
var pipeline = new EmptyPipelineDefinition<Movie>()
.Match(...)
.Group(...)
.Merge(...);
// Executes the aggregation pipeline
var results = collection.Aggregate(pipeline);
// Defines and executes the aggregation pipeline
var results = collection.Aggregate()
.Match(...)
.Group(...)
.Merge(...);

某些聚合阶段在.NET/ C#驱动程序中没有相应的方法。要将这些阶段添加到管道中,请使用 BsonDocument 对象或字符串字面量在 Query API语法中构造一个阶段。 然后,将BSON文档传递给 PipelineDefinitionBuilder.AppendStage() 方法。此语法支持聚合管道中的所有阶段,但不提供类型提示或类型安全。

以下代码示例演示如何将 $unset 阶段添加到空聚合管道:

var pipeline = new EmptyPipelineDefinition<BsonDocument>()
.AppendStage<BsonDocument, BsonDocument, BsonDocument>("{ $unset: 'field1' }");

重要

如果使用 BsonDocument 定义管道阶段,驾驶员无法识别任何 BsonClassMap 属性、序列化属性或序列化约定。您在 BsonDocument 中使用的字段名称必须与存储在MongoDB Server中的字段名称匹配。

下表列出了.NET/ C#驱动程序中与聚合管道中的阶段相对应的构建器方法。要学习;了解有关聚合阶段的更多信息并查看等效C#方法的代码示例,请点击MongoDB Server手册中从阶段名称到其参考页面的链接。

如果表中没有聚合阶段,则驾驶员不会为其提供构建器方法。在这种情况下,您必须使用 BsonDocument 语法将该阶段添加到管道。

聚合阶段
说明
构建器方法

根据指定的表达式和存储桶边界将传入的文档分为多个组(称为存储桶)。

Bucket()

根据指定的表达式,将接收到的文档归类到特定数量的群组中(称为“存储桶”)。自动确定存储桶边界,以尝试将文档均匀地分配到指定数量的存储桶中。

BucketAuto()

返回集合的变更流游标。此阶段在聚合管道中只能发生一次,并且必须作为第一阶段发生。

ChangeStream()

将超过 16 MB 的大型变更流事件拆分为较小的片段,在变更流游标中返回。

您只能在 $changeStream管道中使用 $changeStreamSplitLargeEvent,并且它必须是管道中的最后阶段。

ChangeStreamSplitLargeEvent()

返回聚合管道此阶段的文档数量计数。

Count()

在文档序列中创建新文档,其中缺少字段中的某些值。

Densify()

从输入表达式返回字面文档。

Documents()

在单个阶段内处理同一组输入文档上的多个聚合管道。支持创建多分面聚合,能够在单个阶段中跨多个维度或分面描述数据特征。

Facet()

对集合执行递归搜索。此方法向每个输出文档添加一个新的大量字段,其中包含该文档的递归搜索的遍历结果。

GraphLookup()

按指定的标识符表达式对输入文档进行分组,并将累加器表达式(如果指定)应用于每个群组。使用所有输入文档并为每个不同的群组输出一个文档。输出文档仅包含标识符字段和累积字段(如果指定)。

Group()

将未修改的前n个文档传递到管道,其中n是指定的限制。对于每个输入文档,输出一个文档(对于前n个文档)或零个文档(在前n个文档之后)。

Limit()

同一 数据库中的另一个集合执行左外连接,以过滤“已连接”集合中的文档以便进行处理。

Lookup()

过滤文档流以仅允许匹配的文档将未修改的文档传入下一管道阶段。对于每个输入文档,输出一个文档(一个匹配项)或零个文档(无匹配项)。

Match()

将聚合管道的结果文档写入集合。该阶段可以将结果(插入新文档、合并文档、替换文档、保留现有文档、操作失败、使用自定义更新管道进程文档)合并到输出集合中。要使用此阶段,它必须是管道中的最后一个阶段。

Merge()

将聚合管道的结果文档写入集合。要使用此阶段,它必须是管道中的最后一个阶段。

Out()

重塑流中的每个文档,例如添加新的字段或删除现有字段。对于每个输入文档,输出一个文档。

Project()

用指定的嵌入文档替换文档。该操作会替换输入文档中的所有现有字段,包括 _id 字段。指定嵌入在输入文档中的文档,以将嵌入的文档提升到顶层。

$replaceWith 阶段是 $replaceRoot 阶段的别名。

ReplaceRoot()

用指定的嵌入文档替换文档。该操作会替换输入文档中的所有现有字段,包括 _id 字段。指定嵌入在输入文档中的文档,以将嵌入的文档提升到顶层。

$replaceWith 阶段是 $replaceRoot 阶段的别名。

ReplaceWith()

从其输入中随机选择指定数量的文件。

Sample()

Atlas 集合中的一个或多个字段执行全文搜索。

此阶段仅适用于MongoDB Atlas集群,不适用于自托管部署。要学习;了解更多信息,请参阅Atlas文档中的Atlas Search聚合管道阶段

Search()

返回对 Atlas 集合进行 Atlas Search 查询时,得到的不同类型的元数据结果文档。

此阶段仅适用于MongoDB Atlas集群,不适用于自托管部署。要学习;了解更多信息,请参阅Atlas文档中的Atlas Search聚合管道阶段

SearchMeta()

向文档添加新字段。与 Project() 方法一样,此方法通过向输出文档添加新字段来重塑流中的每个文档,这些输出文档同时包含输入文档中的现有字段和新添加的字段。

Set()

将文档分组到窗口中,并将一个或多个操作符应用于每个窗口中的文档。

SetWindowFields()

跳过前 n 个文档(其中 n 是指定的跳过编号),并将未修改的其余文档传递到管道。对于每个输入文档,输出零个文档(对于前n个文档)或一个文档(如果在前n个文档之后)。

Skip()

按指定的排序键对文档流重新排序。文档保持不变。对于每个输入文档,输出一个文档。

Sort()

根据指定表达式的值对传入文档进行分组,然后计算每个不同群组中的文档数量。

SortByCount()

将两个集合的管道结果合并到一个结果设立。

UnionWith()

解构输入文档中的大量字段,为每个元素输出一个文档。每个输出文档都将大量替换为一个元素值。对于每个输入文档,输出n个文档,其中n是大量元素的数量。对于空大量,n 可以为零。

Unwind()

Atlas 集合的指定字段中的一个向量执行 ANN 搜索。

此阶段仅适用于MongoDB Atlas集群,不适用于自托管部署。

VectorSearch()

要学习;了解有关聚合管道的更多信息,请参阅MongoDB Server手册中的聚合管道

要学习;了解有关创建管道阶段的更多信息,请参阅MongoDB Server手册中的聚合阶段

有关此页面上使用的方法和类的更多信息,请参阅以下API文档:

后退

聚合(Aggregation)

在此页面上