Mongo C#Fluent聚合管道组匿名类型密钥异常

Mongo C#Fluent聚合管道组匿名类型密钥异常,c#,mongodb,mongodb-.net-driver,aggregation-framework,10gen-csharp-driver,C#,Mongodb,Mongodb .net Driver,Aggregation Framework,10gen Csharp Driver,我在10gen Mongo C#driver的v2中使用新的Fluent聚合管道,但在尝试按多个字段分组时遇到异常(下面的示例代码) 引发的异常是 命令聚合失败:异常:组聚合字段“月”必须定义为对象内的表达式。 我可以通过为我的组密钥创建一个类型来实现这一点,但我更愿意使用匿名类型,因为我需要创建的类型没有其他用途 var agg = db.GetCollection<Order>("orders").Aggregate(); var project = agg.Project(o

我在10gen Mongo C#driver的v2中使用新的Fluent聚合管道,但在尝试按多个字段分组时遇到异常(下面的示例代码)

引发的异常是

命令聚合失败:异常:组聚合字段“月”必须定义为对象内的表达式。

我可以通过为我的组密钥创建一个类型来实现这一点,但我更愿意使用匿名类型,因为我需要创建的类型没有其他用途

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;
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" : { } }

问题是您引用的字段没有对其执行聚合。所有不属于_id的字段都需要聚合。您会注意到月份和产品已经是_id的一部分,因此无需在分组语句中再次请求它们。我建议这样做:

var group = project.Group(
    key => new { key.Month, key.Product },
    g => new
    {
         MonthAndProduct = g.Key,
         TotalSales = g.Sum(o => o.Value)
    });
如果您需要在以后将其平坦化,可以将上面的内容更改为返回匿名类型,然后执行客户端投影或使用另一个$project

var project = group.Project(x => new OrderSummary
{
     Month = x.MonthAndProduct.Month, 
     Product = x.MonthAndProduct.Product, 
     TotalSales = x.TotalSales
});
如果您仍然觉得这是驱动程序中的一个bug,请在CSHARP项目下的jira.mongodb.org上提交bug/feature请求单

谢谢,
Craig

我们如何获得由fluent API生成的命令?
var project = group.Project(x => new OrderSummary
{
     Month = x.MonthAndProduct.Month, 
     Product = x.MonthAndProduct.Product, 
     TotalSales = x.TotalSales
});