C#操作MongoDB如何按name分组取每组最新submitted_date数据
解决方案
你需要使用MongoDB的聚合管道来实现分组取每组最新数据的逻辑,直接由数据库侧完成计算,性能远高于内存二次处理。修改后的代码如下:
public List<Customer> GetLatestCustomers(List<string> nameList) { var filter = Builders<Customer>.Filter.Empty; if (nameList.Count > 0) { filter = filter & Builders<Customer>.Filter.In(x => x.name, nameList); } var aggregation = _collection.Aggregate() // 第一步:应用过滤条件,筛选符合要求的文档 .Match(filter) // 第二步:按提交日期降序排序,保证每个name下最新的记录排在最前面 .Sort(Builders<Customer>.Sort.Descending(x => x.submitted_date)) // 第三步:按name分组,取每组第一个文档即最新记录 .Group(x => x.name, g => new { Name = g.Key, LatestRecord = g.First() }) // 第四步:投影为Customer结构,如需保留全部字段可直接写 .Project(x => x.LatestRecord) .Project(x => new Customer { name = x.Name, submitted_date = x.LatestRecord.submitted_date // 其他字段可在此处补充赋值 }); return aggregation.ToList(); }
逻辑说明
- 聚合的
Match阶段和原有Find的过滤逻辑完全等价,筛选规则不变 - 你使用的
yyyyMMdd格式日期不管是数字类型还是字符串类型,降序排序规则都符合业务要求,不需要额外做格式转换 - 如果Customer类还有其他需要返回的字段,可直接简化投影逻辑返回分组内的最新完整文档,不需要逐个字段赋值
内容的提问来源于stack exchange,提问作者leo Ak
相关产品推荐
相关产品推荐

