2015-06-06 62 views
6

我想了蒙戈的第一次和我有一個問題,我有:MongoDB的C#2.0驅動程序多解開

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

,我想找回頂10℃的最高概括金額時我按名字將C分組。因此,例如,約翰·史密斯可能是幾個B的單A內,也可能是B的在幾個不同的A的

我可以在蒙戈外殼內做到這一點通過運行:

db.As.aggregate( 
    {$unwind: "$Bs"}, 
    {$unwind: "$Bs.Cs"}, 
    {$group: { _id: "$Bs.Cs.Name", total: {$sum: "$Bs.Cs.Amount"}}}, 
    {$sort: {total: -1}}, 
    {$limit: 10} 
); 

但我無法弄清楚如何在我的C#應用​​程序中使用MongoDB 2.0驅動程序來完成此操作。有人能指出我正確的方向嗎?

而且,我是一個SQL Server的傢伙,我很習慣使用存儲過程,我應該把這個特殊的骨料在存儲的JavaScript在服務器上,只是把它從我的C#應用​​程序?如果是這樣,你怎麼罵與2.0驅動程序存儲的JavaScript?

謝謝!

回答

4

遺憾的是並不是所有的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(); 
+0

謝謝!這個竅門! – eraly