2014-11-21 53 views
5

我开始与Mongo客户端做一些漂亮的查询和aggretations ..但现在我想在.NET/C#中使用它,我看到我不能简单地运行查询文本字段..Aggregate()的MongoDB结果集

此外,诉诸于建立一个聚合管道,并运行collection.Aggregate()函数后,我得到一个结果集,但我不知道如何遍历它..

任何人都可以帮助指导我吗?

这里是我的代码:

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

而且,我应该说,我是一个有点生疏用C#/ ASP.NET/MVC所以任何空间的简化,将不胜感激。

+0

把你的输出结果,如果可能 – Disposer 2014-11-21 23:43:08

回答

6

您的结果是IEnumerable的BsonDocument,您可以使用BSonSerializer将它们序列化为C#对象。而这个代码片段只是将它们写入到控制台,但你可以看到你键入的对象

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

,然后有一个叫班级平均,其属性名在BSonDocument如果你想匹配的名称,然后重命名(因为_Id在命名约定的c#术语中不太好),你可以在你的管道中添加一个$ project BsonDocument。

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

$工程样品(在管道添加此之前排序

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