2014-11-21 9 views
5

Ho iniziato con il client Mongo facendo alcune query e agevolazioni interessanti .. ma ora che voglio usarlo in .NET/C#, vedo che non posso semplicemente eseguire la query come campo di testo ..Set di risultati MongoDB per Aggregate()

Inoltre, dopo il ricorso alla costruzione di un'aggregazione Pipeline, e in esecuzione la funzione collection.Aggregate(), sto diventando un set di risultati, ma non ho idea di come attraversare esso ..

Qualcuno può aiutarmi a guidarmi qui?

Ecco il mio codice:

var coll = db.GetCollection("animals"); 
var match = new BsonDocument { 
    { "$match", new BsonDocument {{"category","cats"}} } 
}; 

var group = new BsonDocument{ 
    { 
     "$group", new BsonDocument{ 
      {"_id", "$species"}, 
      {"AvgWeight", new BsonDocument{{"$avg", "$weight"}}} } 
    } 
}; 

var sort = new BsonDocument{{"$sort", new BsonDocument{{"AvgWeight", -1}}}}; 
var pipeline = new[] { match, group, sort }; 
var args = new AggregateArgs { Pipeline = pipeline }; 
var res = coll.Aggregate(args); 

foreach (var obj in res) 
{ 
    // WHAT TO DO HERE?? 
} 

Inoltre, devo dire che sono un po 'arrugginito con C#/ASP.NET/MVC in modo alcuno spazio per la semplificazione sarebbe molto apprezzato.

+0

mettere il risultato in uscita, se il suo possibile – Disposer

risposta

6

Il risultato è IEnumerable di BsonDocument, è possibile serializzarli su oggetti C# utilizzando BSonSerializer. E questo frammento di codice semplicemente li scrive alla tua console, ma si può vedere che avete digitato oggetti

List<Average> returnValue = new List<Average>(); 
returnValue.AddRange(documents.Select(x=> BsonSerializer.Deserialize<Average>(x))); 

foreach (var obj in returnValue) 
{ 
    Console.WriteLine("Species {0}, avg weight: {1}",returnValue._Id,returnValue.AvgWeight); 
} 

E poi avere una classe chiamata media, in cui il nome della proprietà corrispondono i nomi nel BSonDocument, se si desidera rinominare quindi (poiché _Id non è così bello in termini di C# riguardo le convenzioni di denominazione), è possibile aggiungere un progetto $ BsonDocument alla pipeline.

public class Average 
{ 
     public string _Id { get; set; } 
     public Double AvgWeight {get; set; } 
} 

campione $ progetto (aggiungere questo nella vostra pipeline poco prima sorta

var project = new BsonDocument 
      { 
       { 
        "$project", 
        new BsonDocument 
         { 
          {"_id", 0}, 
          {"Species","$_id"}, 
          {"AvgWeight", "$AvgWeight"}, 
         } 
       } 
      };