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?
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With