4

Я использую новую конвейерную конвейерную конвейерную систему в v2 драйвера 10gen Mongo C#, но испытываю исключение при попытке группировать более чем одно поле (пример кода ниже).Mongo C# Fluent Aggregation Pipeline Group Анонимный тип Key Exception

Исключение, которое выбрасывается в ...

Команда агрегатный не удалось: исключение: группа агрегатный поле «Месяц» должен быть определен как выражение внутри объекта.

Я могу заставить это работать, создав тип для моего группового ключа, но предпочел бы использовать анонимный тип, поскольку тип, который мне нужно будет создать, не будет служить никакой другой цели.

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; } 

} 

Команда порождена беглом 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" : { } } 

ответ

8

Проблема заключается в том, что вы имеете в виду поле без выполнения агрегация на нем. Все поля, которые не являются частью _id, должны быть агрегированы. Вы заметите, что Month и Product уже являются частью _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.

Thanks, Craig