2015-06-06 4 views
6

Ich versuche zum ersten Mal Mongo und ein Problem habe, wo ich:MongoDB C# 2.0 Driver Multiple Wickelt

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

und ich möchte die Top-10-C ist mit dem höchsten zurück Summed Beträge, wenn Ich gruppiere C mit Namen. So könnte zum Beispiel John Smith in einem einzigen A in mehreren B sein und auch in B unter mehreren verschiedenen A des

könnte ich kann dies erreichen innerhalb der Mongo Shell durch Ausführen von:

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

Aber ich kann nicht herausfinden, wie dies in meiner C# -App mit dem MongoDB 2.0-Treiber zu tun ist. Könnte mir jemand in die richtige Richtung zeigen?

Auch ich bin ein SQL Server-Typ und bin sehr an die Verwendung von Sprocs gewöhnt, sollte ich dieses bestimmte Aggregat in einem gespeicherten Javascript auf dem Server und nur aus meiner C# -App aufrufen? Wenn ja, wie rufen Sie gespeichertes Javascript mit dem 2.0 Treiber auf?

Danke!

Antwort

4

Leider können nicht alle MongoDB-Abfragen mit LINQ geschrieben werden. Jedenfalls können Sie es durch Aggregation implementieren:

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

Vielen Dank! Das hat den Trick gemacht! – eraly

Verwandte Themen