Dima G
Dima G

Reputation: 2025

Mongodb C# - How to group by multiple fields ( Aggregate )

The documents look like this:

{
  Age: 20,
  Gender: "Male",
  SomeField: "ABC"
  SomeParameter: 17.7
}

With C# mongodb driver, how do you write something like this?

SELECT Age, Gender, MIN(SomeParameter), MAX(SomeParameter)
FROM ...
WHERE SomeField = 'ABC'
GROUP BY Age, Gender

So that for each combination (group) of Gender and Age we'll get min & max of SomeParameter

Upvotes: 1

Views: 4465

Answers (1)

Dima G
Dima G

Reputation: 2025

The key to this is in the "_id" value construction:

IMongoCollection<BsonDocument> collection = GetYourCollectionHere();

// there are many ways to create a filter. Using Builders here.
var filter = Builders<BsonDocument>.Filter.Eq("SomeField", "ABC"); 

var groupby = new BsonDocument("_id", new BsonDocument {
                        { "Gender", "$Gender" },
                        { "Age", "$Age" }
                })
                .Add("Min", new BsonDocument("$min", "$SomeParameter"))
                .Add("Max", new BsonDocument("$max", "$SomeParameter"));

var result = collection
                .Aggregate()
                .Match(filter)
                .Group(groupby);

// to see the output
foreach (var doc in result)
{
    Console.WriteLine(doc.ToJson());
}

Upvotes: 1

Related Questions