在C#中使用过滤的MongoDB GroupBy SUM。

问题描述 投票:0回答:1

我使用下面的聚合流水线获得结果分组,但我想在布尔值的总和中添加一个过滤器,我使用了下面的代码,需要纠正的是 IsResponseRecieved 代码中的一行。

var group = new BsonDocument
{
  {
    "$group",
      new BsonDocument
    {
      { "_id", new BsonDocument{ { "Class", "$Class" } } },
      { "TotaRecords", new BsonDocument{ { "$sum", 1 } } },
      { "RequestTime", new BsonDocument("$sum", "$RequestTime") },
      { "ProcessTime", new BsonDocument("$sum", "$ProcessTime") },
      { "AvgRequestTime", new BsonDocument("$avg", "$RequestTime") },
      { "AvProcessTime", new BsonDocument("$avg", "$ProcessTime") },
      { "IsResponseRecieved", new BsonDocument("$sum", { $cond: [{ $eq: ["$IsResponseRecieved", false] }, 1, 0] } })
    }
  }
}
};
var pipeline = new [] { group };
var res = LogDB.GetCollection<BsonDocument>("tblLogs").Aggregate<BsonDocument>(pipeline).ToList();
c# mongodb mongodb-.net-driver
1个回答
0
投票

最简单的方法是用下面的代码将json的blob解析成BSON文档。

var group = new BsonDocument
           {
                {
                    "$group",
                    new BsonDocument
                    {
                        { "_id", new BsonDocument{ { "Class", "$Class" } } },
                        { "TotaRecords", new BsonDocument{ { "$sum", 1 } } },
                        { "RequestTime", new BsonDocument("$sum", "$RequestTime") },
                        { "ProcessTime", new BsonDocument("$sum", "$ProcessTime") },
                        { "AvgRequestTime", new BsonDocument("$avg", "$RequestTime") },
                        { "AvProcessTime", new BsonDocument("$avg", "$ProcessTime") },
                        { "IsResponseRecieved", new BsonDocument("$sum", BsonDocument.Parse(@"{ $cond: [{ $eq: [""$IsResponseRecieved"", false]}, 1, 0] }")) }
                    }
                }
            };

你可以创建一个像下面这样的类型化的 bson 文档。

var isResponseRecieved = new BsonDocument("$cond",
    new BsonArray(new BsonValue[]
    {
        new BsonDocument("$eq",
            new BsonArray(new BsonValue[]{ "$IsResponseRecieved" , false})), 
        1, 
        0
    }));
var group = new BsonDocument
{
    {
        "$group",
        new BsonDocument
        {
            { "_id", new BsonDocument{ { "Class", "$Class" } } },
            { "TotaRecords", new BsonDocument{ { "$sum", 1 } } },
            { "RequestTime", new BsonDocument("$sum", "$RequestTime") },
            { "ProcessTime", new BsonDocument("$sum", "$ProcessTime") },
            { "AvgRequestTime", new BsonDocument("$avg", "$RequestTime") },
            { "AvProcessTime", new BsonDocument("$avg", "$ProcessTime") },
            { "IsResponseRecieved", isResponseRecieved }
        }
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.