C# MongoDB 驱动程序分组

本文关键字:驱动程序 MongoDB | 更新日期: 2023-09-27 17:56:39

>我尝试执行此查询:

MongoCollection<AnalyticsClicks> dbCollection = DetermineCollectionName<AnalyticsClicks>();
var query = from c in dbCollection.AsQueryable()
    where c.UserId == userId && c.CampaignId == campaignId
    select new
    {
        c.Email,
        c.Link
    };
var res = query.GroupBy(x => x.Email, b => b.Link).Count();

但我有例外:

不支持 GroupBy 查询运算符。

我在机器人中写了一个等效的请求

db.analyticsClicks.aggregate(
{ $match: { UserId: 4790, CampaignId: 92093}},
{ $group : {
        "_id" : { 
            "Email" : "$Email",
            "Link" : "$Link",
        } 
    }
})

它有效,但我还需要获取当前集合中的项目计数。如何使用 C# mongo 驱动程序重写此查询?

C# MongoDB 驱动程序分组

您可以使用聚合框架。此示例适用于MongoDB.Driver 2.0

var collection = database.GetCollection<Item>("Item");
var result = await collection
      .Aggregate()
      .Group(new BsonDocument
      {
           {
               "_id", new BsonDocument
               {
                   {"Email", "$Email"},
                   {"Link", "$Link"},
               }
           }
      })
      .Group(new BsonDocument
      {
           { "_id", "_id" },
           {"count", new BsonDocument("$sum", 1)}
      })
      .FirstAsync();
var count = result["count"].AsInt32;

谢谢,这是我的工作示例

MongoCollection<AnalyticsClicks> dbCollection = DetermineCollectionName<AnalyticsClicks>();
            var match = new BsonDocument 
            { 
                { 
                    "$match", 
                    new BsonDocument {{"UserId", userId}, {"CampaignId", campaignId}} 
                } 
            };
            var group = new BsonDocument 
            { 
                { "$group", 
                    new BsonDocument 
                    { 
                        { "_id", new BsonDocument {{"Email", "$Email" }, {"Link", "$Link"}, }}, 
                    } 
                } 
            };
            AggregateArgs pipeline = new AggregateArgs()
            {
                Pipeline = new[] { match, group }
            };
            var result = dbCollection.Aggregate(pipeline);
            return Convert.ToInt32(result.Count());

我认为驱动程序只是没有实现Linq GroupBy 方法。请改用聚合框架。你可以在这里找到很好的例子 - C#中的MongoDB聚合框架示例

您无需链接任何新库,MongoDB C# 驱动程序对聚合框架的支持。

希望对您有所帮助!