Aggregate()的MongoDB结果集

时间:2014-11-21 23:32:34

标签: c# asp.net-mvc mongodb

我开始使用Mongo客户端做一些漂亮的查询和凝聚..但现在我想在.NET / C#中使用它,我发现我不能简单地将查询作为文本字段运行.. < / p>

此外,在求助于构建聚合管道并运行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有点生疏,所以任何简化的余地都会非常受欢迎。

1 个答案:

答案 0 :(得分:6)

您的结果是BonDocument的IEnumerable,您可以使用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);
 }

然后有一个名为Average的类,其中属性名称与BSonDocument中的名称匹配,如果要重命名(因为_Id在命名约定的c#术语中不太好),可以添加$ project BsonDocument到您的管道。

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

$ project sample(在排序之前将其添加到管道中

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