Jerzy Gawor
Jerzy Gawor

Reputation: 151

MongoDB .NET Group by with list result of whole objects

I was digging into the documentation of MongoDB http://mongodb.github.io/mongo-csharp-driver/2.7/reference/driver/crud/linq/ and I saw, using .NET drive is possible to make group by on the database.

For 1 ProductId I can have few elements in a database. I want to get whole Last element.

So I am trying to do something like:

var query = _collection.AsQueryable()
            .GroupBy(p => p.ProductId, (k, s) =>
                new { Name = k, Result = s.First() })
            .Select(x => new { Name = x.Name, Result = x.Result }).First();

The problem is that I see an error message like:

System.NotSupportedException: Specified method is not supported.
at
MongoDB.Driver.Linq.Processors.AccumulatorBinder.GetAccumulatorArgument(Expression node)

I know that for now in my example i didnt order by the result.. But this will be my second step. For now i see that i cannot group by. Is it possible to do this kind of group by?

Upvotes: 1

Views: 948

Answers (1)

Jerzy Gawor
Jerzy Gawor

Reputation: 151

My solution for that is:

var query = _collection.Aggregate(new AggregateOptions { AllowDiskUse = true })
            .Match(x => ElementIds.Contains(x.ElementId))
            .SortByDescending(x => x.StartDate).ThenByDescending(x => x.CreatedAt)
            .Group(x => x.ElementId, x => new
            {
                StartDate = x.First().StartDate,
                Grades = x.First().Grades,
                SellingId = x.First().SellingId,
                CreatedAt = x.First().CreatedAt,
                ModifiedAt = x.First().ModifiedAt,
                Id = x.First().Id,
                ElementId = x.First().ElementId
            })
            .ToEnumerable(token);

After that, I parsed it into my model.

AllowDiskUse = true, because in my case MongoDB's memory is not enough to handle this operation.

Upvotes: 1

Related Questions