Mongo C# Fluent Aggregation Pipeline Group Исключение Ключа Анонимного Типа
Я использую новый конвейер Fluent Aggregation в версии v2 драйвера 10gen Mongo C#, но испытываю исключение при попытке сгруппировать более чем по одному полю (пример кода ниже).
Исключение, которое выбрасывается ...
Команда aggregate failed: exception: поле Group aggregate 'Month' должно быть определено как выражение внутри объекта.
Я могу заставить это работать, создав тип для моего ключа группы, но предпочел бы использовать анонимный тип в качестве тип, который мне нужно будет создать, не будет служить никакой другой цели.
var agg = db.GetCollection<Order>("orders").Aggregate();
var project = agg.Project(o => new {o.Value
, o.Product
, Month = o.Date.Month
, Year = o.Date.Year});
var group = project.Group(
key => new { key.Month, key.Product},
g => new OrderSummary {Month = g.Key.Month
,Product = g.Key.Product
, TotalSales = g.Sum(o => o.Value)});
var result = group.ToListAsync().Result;
Для справки ...
public class Order : Entity
{
public DateTime Date { get; set; }
public string Product { get; set; }
public double Value { get; set; }
}
public class OrderSummary
{
public string Product { get; set; }
public int Month { get; set; }
public int Year { get; set; }
public double TotalSales { get; set; }
}
Команда, генерируемая fluent API, является ...
{ "aggregate" : "Order",
"pipeline" : [
{ "$project" : { "Value" : "$Value", "Product" : "$Product", "Month" : { "$month" : "$Date" }, "Year" : { "$year" : "$Date" }, "_id" : 0 } }
, { "$group" : {
"_id" : { "Month" : "$Month", "Product" : "$Product" }
, "Month" : "$Month"
, "Product" : "$Product"
, "TotalSales" : { "$sum" : "$Value" } } }]
, "cursor" : { } }
1 ответ:
Проблема заключается в том, что вы ссылаетесь на поле без выполнения агрегации по нему. Все поля, которые не являются частью _id, должны быть объединены. Вы заметите, что месяц и продукт уже являются частью _id, поэтому нет необходимости запрашивать их снова в операторе группировки. Я бы предложил сделать это вместо этого:
var group = project.Group( key => new { key.Month, key.Product }, g => new { MonthAndProduct = g.Key, TotalSales = g.Sum(o => o.Value) });
Если вам нужно сгладить это позже, вы можете изменить вышеизложенное, чтобы вернуть анонимный тип, а затем либо сделать проектирование на стороне клиента, либо с помощью другой проект.
var project = group.Project(x => new OrderSummary { Month = x.MonthAndProduct.Month, Product = x.MonthAndProduct.Product, TotalSales = x.TotalSales });
Если вы все еще чувствуете, что это ошибка в драйвере, пожалуйста, отправьте запрос на ошибку/функцию по адресу jira.mongodb.org в рамках проекта CSHARP.
Спасибо, Крейг