2015-06-06 15 views
6

Tôi đang cố gắng ra Mongo cho lần đầu tiên và đang gặp một vấn đề mà tôi có:MongoDB C# 2.0 driver Nhiều tháo

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

và tôi muốn lấy lại top 10 C với mức cao nhất tóm tắt Các khoản khi Tôi nhóm C theo tên. Vì vậy, ví dụ, John Smith có thể là trong một số của B trong vòng một Một đơn và cũng có thể là trong B giữa vòng khác nhau của Một

tôi có thể thực hiện điều này trong trong Mongo Shell bằng cách chạy:

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

Nhưng tôi không thể tìm ra cách để làm điều này trong ứng dụng C# của tôi bằng cách sử dụng trình điều khiển MongoDB 2.0. Ai đó có thể chỉ cho tôi đi đúng hướng không?

Ngoài ra, tôi là một máy chủ SQL Server và rất quen với việc sử dụng sprocs, tôi nên đặt tổng hợp cụ thể này trong một javascript được lưu trữ trên máy chủ và chỉ cần gọi nó từ ứng dụng C# của tôi? Nếu vậy, làm thế nào để bạn gọi javascript được lưu trữ với trình điều khiển 2.0?

Cảm ơn!

Trả lời

4

Thật không may, không phải tất cả các truy vấn MongoDB đều có thể được viết bằng LINQ. Dù sao, bạn có thể triển khai thông qua tổng hợp:

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

Cảm ơn! Điều này đã làm các trick! – eraly

Các vấn đề liên quan