MongoDB C#2.0驱动程序多次展开

时间:2015-06-06 17:47:59

标签: c# mongodb mongodb-query aggregation-framework

我第一次尝试使用Mongo并遇到问题:

public class A
{
    public int ID {get;set;}
    .
    .
    .
    public List<B> Bs { get; set; }
}

public class B
{
    public int ID { get; set; }
    .
    .
    .
    public List<C> Cs { get; set; }
}

public class C
{
    public string Name { get; set; }
    public double Amount { get; set; }
}

我希望在按名称分组C时,以最高的累计金额返回前10名C.因此,例如,约翰史密斯可以在单个A中的几个B中,也可以在几个不同的A中的B中

我可以通过运行:

在Mongo Shell中完成此任务
db.As.aggregate(  
  {$unwind: "$Bs"},
  {$unwind: "$Bs.Cs"},
  {$group: { _id: "$Bs.Cs.Name", total: {$sum: "$Bs.Cs.Amount"}}},
  {$sort: {total: -1}},
  {$limit: 10}
);

但我无法弄清楚如何使用MongoDB 2.0驱动程序在我的C#应用​​程序中执行此操作。有人能指出我正确的方向吗?

另外,我是一个SQL Server人员并且非常习惯使用sprocs,我应该将这个特定的聚合放在服务器上存储的javascript中,只是从我的C#app中调用它吗?如果是这样,你如何使用2.0驱动程序调用存储的javascript?

谢谢!

1 个答案:

答案 0 :(得分:6)

不幸的是,并非所有MongoDB查询都可以使用LINQ编写。无论如何,你可以通过聚合实现它:

var collection = database.GetCollection<A>("As");
var result = await collection
      .Aggregate()
      .Unwind(x => x.Bs)
      .Unwind(x => x["Bs.Cs"])
      .Group(new BsonDocument {{"_id", "$Bs.Cs.Name"}, {"total", new BsonDocument("$sum", "$Bs.Cs.Amount")}})
      .Sort(new BsonDocument("total", -1))
      .Limit(10)
      .ToListAsync();