C#使用MongoDB Driver分组时触发Key Not Found异常问题排查
解决MongoDB Driver分组时抛出"Element 'ProjectNumber' not found"异常的问题
没错,你猜的完全在点子上——这个异常最常见的原因就是你的18k条数据里确实存在没有ProjectNumber字段的文档。
为什么会抛出这个异常?
当你用project["ProjectNumber"]这种索引器访问BsonDocument的字段时,MongoDB Driver的默认行为是:如果目标文档里不存在这个键,就直接抛出KeyNotFoundException(也就是你看到的"Element 'ProjectNumber' not found"错误),它不会自动返回null或者默认值,而是严格要求字段必须存在。
当然还有个小概率情况:你可能不小心写错了字段名!MongoDB的字段名是区分大小写的,如果数据库里实际存的是projectNumber(小写首字母),而你代码里写的是ProjectNumber,也会触发这个异常,建议先抽查几条数据确认字段名的拼写和大小写是否完全一致。
怎么解决?
根据你的业务需求,可以选下面两种方案:
方案1:过滤掉缺失字段的文档(如果业务要求所有文档必须有ProjectNumber)
在分组前先把没有ProjectNumber的文档过滤掉,避免触发异常:
internal List<Project> RegroupProject(IEnumerable<BsonDocument> projects) { var regroupProjectList = new List<Project>(); // 先过滤出包含ProjectNumber字段的文档 var validProjects = projects.Where(p => p.Contains("ProjectNumber")).ToList(); var groupedProject = validProjects.GroupBy(project => project["ProjectNumber"]).ToList(); // 后续处理逻辑... return regroupProjectList; }
方案2:兼容缺失字段的文档(如果业务允许部分文档没有该字段)
用TryGetValue或者GetValue方法安全获取字段值,把缺失字段的文档归到一个默认组里(比如用BsonNull.Value作为分组键):
internal List<Project> RegroupProject(IEnumerable<BsonDocument> projects) { var regroupProjectList = new List<Project>(); var groupedProject = projects.GroupBy(project => { // 尝试获取字段值,不存在则返回默认标识 if (project.TryGetValue("ProjectNumber", out var projectNumber)) { return projectNumber; } return BsonNull.Value; }).ToList(); // 或者用更简洁的GetValue方式 // var groupedProject = projects.GroupBy(project => project.GetValue("ProjectNumber", BsonNull.Value)).ToList(); // 后续处理逻辑... return regroupProjectList; }
内容的提问来源于stack exchange,提问作者Xavier W.
相关产品推荐
相关产品推荐

