Reputation: 2467
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
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