MongoDB .Net如何编写Group/Aggregate查询获取指定日期及之前的最新记录
解决方案
你遇到的报错原因是MongoDB .NET驱动的LINQ转换器不支持在Group的投影函数内嵌套Where、OrderBy这类集合操作,只要把聚合逻辑拆分为独立的阶段即可实现纯.NET语法的查询,无需手动构造BsonDocument。
正确实现代码
member this.GetFundsToDate(date: System.DateTime): FundAtDate list = let aggregate = base.Collection.Aggregate() // 第一阶段:过滤所有日期小于等于目标值的记录,排除未来数据 .Match(fun f -> f.Date <= date) // 第二阶段:按日期降序排序,最新的记录排在最前 .SortByDescending(fun f -> f.Date) // 第三阶段:按币种分组,每组取第一条就是该币种的最新记录 .Group( keyFunc = (fun f -> f.CurrencyCode), groupFunc = (fun g -> g.First()) ) aggregate.ToEnumerable() |> List.ofSeq
逻辑说明
- 先执行
Match阶段过滤数据,减少后续运算的数据量 - 对过滤后的所有记录按日期倒序排列,相同币种的最新记录会排在该币种所有记录的最前面
- 按币种分组时直接取每组第一条,即可得到每个币种小于等于目标日期的最新记录
该写法完全使用强类型的.NET语法,所有操作都会被MongoDB驱动自动翻译为原生聚合语句,不需要手动构造任何BsonDocument,完全符合你的测试用例要求。
内容的提问来源于stack exchange,提问作者Alex 75
相关产品推荐
相关产品推荐

