FalcoGer
FalcoGer

Reputation: 2467

MongoDB C# Aggregate Count

I wish to use the C# Driver (V 2.7.0) to aggregate on a collection and then count the results.

Assuming I have an IMongoCollection col, I do the aggregate like this:

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

I wish to get the number of documents returned by the aggregation. in the shell you would do something like this

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

and you would get a document (or no document) with a single "count" field, having an int64 value of the number of elements from the stage before it.

There is an IAggregateFluent.Count() Function. However it returns an IAggregateFluent I want an AggregateCountResult or just a simple unsigned long.

How does one use the Aggregate.Count() function?

Upvotes: 4

Views: 7000

Answers (1)

FalcoGer
FalcoGer

Reputation: 2467

Instead of just appending Count(), which gets you an aggregation stage, you must finish the aggregation with either .ToCursor or .FirstOrDefault or similar. The FirstOrDefault returns the AggregateCountResult, which has the Count property.

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

Upvotes: 13

Related Questions