user348173
user348173

Reputation: 9278

C# Mongodb. Sum field for all documents

I need to calculate total for all document in the collection. For example, I have the following three documents:

_id: 1,
clientId: 1,
cash: 500

_id: 2,
clientId: 1,
cash: 100

_id: 3,
clientId: 2,
cash: 200

So, I want to sum cash field for the specific clientId. For the client 1 I want to get 600, for the client 2 I wanto get 200. It's my first usage of aggregation frameworkd in MongoDB. I checked documentation and the other questions from SO, but can't figure out, why I have to use group clause. Why do I need it, if just want to sum. I event tried to use Group but can't get it compile:

_collection.Aggregate().Match(t=>t.ClientId == 1).Group(null, g => new
            {
                Total = g.Sum(o => o.Cash)
            });

No overload for method 'Group' takes 2 arguments

PS. I don't want to use BsonDocument and such thing like $sum keywords. I want to make it in more C# way.

Upvotes: 9

Views: 7606

Answers (1)

BOR4
BOR4

Reputation: 630

is this ok?

var Total = _collection.AsQueryable().Where(x => x.ClientId == 2).Sum(x => x.Cash);

EDIT: aggregate is overkill here but it would go maybe like this:

var x = MongoCollection.Aggregate()
                    .Group(
                            doc => doc.clientId,
                            group => new
                            {
                                clientId = group.Key,
                                Total = group.Sum(y => y.sum)
                            }
                    ).ToList().FirstOrDefault(c => c.clientId == 2).Total;

aggregation is executed in Db until it goes toList()

Upvotes: 16

Related Questions