MongoDB C# 聚合计数

Fal*_*Ger 1 c# mongodb

我希望使用 C# 驱动程序 (V 2.7.0) 聚合集合,然后计算结果。

假设我有一个 IMongoCollection col,我会像这样进行聚合:

IAsyncCursor<BsonDocument> cursor = col.Aggregate()
    .Match(someFilterDefinition)
    .Project(someProjectionDefinition)
    .Unwind("someFieldName")
    .ToCursor();
while (cursor.MoveNext())
{
    foreach (BsonDocument doc in cursor.Current)
    {
        doStuff(doc);
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望获得聚合返回的文档数。在 shell 中你会做这样的事情

db.getCollection("someCollectionName").aggregate(
    [
        { 
            "$match" : {
                // some match filter
            }
        }, 
        { 
            "$project" : {
                "someField" : 1
            }
        }, 
        { 
            "$unwind" : "$someField"
        }, 
        { 
            "$count" : "count"
        }
    ], 
    { 
        "allowDiskUse" : false
    }
);
Run Code Online (Sandbox Code Playgroud)

并且您将获得一个带有单个“计数”字段的文档(或没有文档),它的 int64 值是它之前阶段的元素数量。

有一个IAggregateFluent.Count()函数。但是它返回一个 IAggregateFluent 我想要一个 AggregateCountResult 或只是一个简单的 unsigned long。

如何使用 Aggregate.Count() 函数?

Fal*_*Ger 9

您必须使用 .ToCursor 或 .FirstOrDefault 或类似文件来完成聚合,而不是仅仅附加 Count(),这会为您提供聚合阶段。FirstOrDefault 返回具有 Count 属性的 AggregateCountResult。

ulong count = col.Aggregate()
    .Match(someFilterDefinition)
    .Project(someProjectionDefinition)
    .Unwind("someFieldName")
    .Count()
    .FirstOrDefault() // returns AggregateCountResult
    .Count();         // returns ulong
Run Code Online (Sandbox Code Playgroud)

  • 请注意:当没有要计数的条目时,“.Count()”将不返回任何元素。因此 `.FirstOrDefault()` 为 null,并且 `.Count` 将抛出 NullReferenceException。 (2认同)