2015-06-06 22 views
6

che sto provando Mongo per la prima volta e sto avendo un problema dove ho:MongoDB C# 2.0 Driver multipla svolgimento Svolge

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

e voglio tornare i primi 10 C di con il più alto sommata Importi quando Io raggruppo C per nome. Così, per esempio, John Smith potrebbe essere in diversi B è all'interno di un singolo A e potrebbe anche essere in B di tra diversi diversi Una di

posso raggiungere questo obiettivo entro nel Mongo Shell eseguendo:

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

Ma io Non riesco a capire come farlo all'interno della mia app C# usando il driver MongoDB 2.0. Qualcuno potrebbe indicarmi la giusta direzione?

Inoltre, io sono un ragazzo di SQL Server e sono molto abituato a utilizzare sprocs, dovrei mettere questo particolare aggregato in un javascript memorizzato sul server e basta chiamarlo dalla mia app C#? In tal caso, come si chiama javascript memorizzato con il driver 2.0?

Grazie!

risposta

4

Sfortunatamente non tutte le query MongoDB possono essere scritte con LINQ. In ogni caso è possibile implementarlo tramite aggregazione:

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

Grazie! Questo ha fatto il trucco! – eraly

Problemi correlati