4

我在10gen Mongo C#驅動程序的v2中使用新的Fluent Aggregation Pipeline,但在嘗試通過多個字段進行分組時遇到了異常(示例代碼如下)。Mongo C#流利聚集管道組匿名類型鍵異常

時引發是例外...

命令骨料失敗:異常:該組聚合字段「月」必須被定義爲一個對象內的表達式。

我可以通過爲我的組密鑰創建一個類型來獲得此功能,但寧願使用匿名類型,因爲我需要創建的類型不會用於其他目的。

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

如果你還是覺得這是在驅動程序中的bug,請提交在jira.mongodb.org一個bug /功能請求票CSHARP項目下。

謝謝, 克雷格