You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

逻辑说明

  1. 先执行Match阶段过滤数据,减少后续运算的数据量
  2. 对过滤后的所有记录按日期倒序排列,相同币种的最新记录会排在该币种所有记录的最前面
  3. 按币种分组时直接取每组第一条,即可得到每个币种小于等于目标日期的最新记录

该写法完全使用强类型的.NET语法,所有操作都会被MongoDB驱动自动翻译为原生聚合语句,不需要手动构造任何BsonDocument,完全符合你的测试用例要求。


内容的提问来源于stack exchange,提问作者Alex 75

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:54:03