C# 中的 Mongodb 流式聚合和分组

Posted

技术标签:

【中文标题】C# 中的 Mongodb 流式聚合和分组【英文标题】:Mongodb fluent aggregation and grouping in C# 【发布时间】:2021-12-31 22:09:24 【问题描述】:

我的 .Net / C# 应用程序在 Mongodb 中存储了一些信息。 Mongodb文档在C#中对应的结构如下:

public class GlobalInfo

    public ObjectId Id  get; set; 
    public string Country  get; set; 
    public string City  get; set; 
    public int Population  get; set; 

我想从 Mongodb 文档中提取包含所有国家/地区的 List<CountryInfo>,或者最终提取为 Dictionary<string, List<CityInfo>>(国家名称将是字典键),基于以下类:

public class CountryInfo

    public string Name  get; set; 
    public List<CityInfo> Cities  get; set; 


public class CityInfo

    public string Name  get; set; 
    public int Population  get; set; 

我找到了一些关于类似功能的 c# 示例,这些示例是在 Mongodb C# 驱动程序的 Aggregate()Match()Group() 方法的帮助下实现的。我不确定如何在我的示例中使用它们。

基本上,我需要将带有 Mongodb db 文档的平面列表转换为带有嵌套列表或字典的分层模型。有人可以帮忙提供一些样品吗?

【问题讨论】:

【参考方案1】:

您可以使用group 关键字并按国家/地区对实体进行分组,然后在select 中构造一个对象CountryInfo,您可以使用组中的Key 值设置Name,@ 987654328@ 值是国家名称,然后对于Cities,您使用Select LinQ 方法,该方法允许您构造另一个实体的列表。您使用Name = country.CityPopulation = country.Population 构造一个CityInfo 对象,如下所示。

listGlobalInfo 是一个列表,包含来自 mongoDB 的所有文档,类型为 GlobalInfo

 var newList = from globalInfo in listGlobalInfo
                group globalInfo by globalInfo.Country into country
                    select new CountryInfo Name = country.Key, Cities = country.Select(city=> new CityInfo  Name = city.City, Population = city.Population).ToList();

如果您想查看更多group 查询示例,您可以转到https://docs.microsoft.com/en-us/dotnet/csharp/linq/group-query-results

【讨论】:

感谢您提供样品。但实际上我正在寻找使用来自 mongodb c# 驱动程序的流利聚合的解决方案,如下所示: var results = myMongodbCollection.Aggregate().Group( x => x.Country, g => new CountryName = g.Key , ... 哎呀,我的糟糕 OP :) 找到了一些示例 mikaelkoskinen.net/post/… 感谢您的链接。不幸的是,它不是基于最新的 mongodb c# 驱动程序,也没有使用 lambda 表达式时类型安全的示例。

以上是关于C# 中的 Mongodb 流式聚合和分组的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB基础教程系列--第七篇 MongoDB 聚合管道

MongoDB聚合操作总结

MongoDB聚合操作总结

04 MongoDB各种查询操作 以及聚合操作总结

MongoDB按聚合查询分组

MongoDB中的索引操作总结