使用 LINQ 的 MongoDB C# 聚合

Tho*_*mas 7 c# aggregation mongodb

我有一个带有这些字段的 mongo 对象:

DateTime TimeStamp;
float    Value;
Run Code Online (Sandbox Code Playgroud)

如何在 C# 中使用 LINQ 获取聚合管道,以获取特定时间戳范围内 Value 的最小值、最大值和平均值?

我看过一些聚合示例,但我不太明白。有一个像这样的简单案例的例子肯定会(希望)让我理解它。

mic*_*ckl 7

您可以使用 LINQ 语法,该语法被转换为聚合框架的语法。假设您有以下Model课程:

public class Model
{
    public DateTime Timestamp { get; set; }
    public float Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用where指定时间戳范围,然后使用groupwithnull作为分组键。MongoDB的驱动器将翻译MinMaxAverage从匿名类型进入$max$min$avg从聚合框架语法

var q = from doc in Col.AsQueryable()
        where doc.Timestamp > DateTime.Now.AddDays(-3)
        where doc.Timestamp < DateTime.Now.AddDays(3)
        group doc by (Model)null into gr
        select new
        {
            Avg = (double)gr.Average(x => x.Value),
            Min = gr.Min(x => x.Value),
            Max = gr.Max(x => x.Value)
        };

var result = q.First();
Run Code Online (Sandbox Code Playgroud)

可以在此处找到 MongoDB 驱动程序支持的累加器列表。

编辑:(Model)null是必需的,因为查询必须转换为$groupwith _idset to null( docs ),因为您想通过聚合获得一个结果。仅出于 C# 编译器的目的需要强制转换,因为 doc 是Model.