我有一个Mongo对象,包含以下字段:
DateTime TimeStamp;
float Value;
如何使用LINQ在C#中获取聚合管道,以获取特定时间戳范围内Value的最小值、最大值和平均值?
我已经看过一些聚合示例,但是我还不太理解。如果能有一个简单案例的示例,那肯定会让我更容易理解。
我有一个Mongo对象,包含以下字段:
DateTime TimeStamp;
float Value;
如何使用LINQ在C#中获取聚合管道,以获取特定时间戳范围内Value的最小值、最大值和平均值?
我已经看过一些聚合示例,但是我还不太理解。如果能有一个简单案例的示例,那肯定会让我更容易理解。
public class Model
{
public DateTime Timestamp { get; set; }
public float Value { get; set; }
}
您可以使用where
指定时间戳范围,然后使用group
和null
作为分组键。MongoDB驱动程序将从匿名类型中将Min
、Max
和Average
翻译成聚合框架语法中的$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();
(Model)null
,因为查询必须转换为$group
,并将_id
设置为null
(文档),因为您想要使用聚合函数获取一个结果。强制转换只是为了C#编译器的目的,因为doc的类型是Model
。$match
- 检索时间戳 TimeStamp
值介于某个定义的minDate
和maxDate
之间的文档。$group
- 以空值进行分组。这将把所有文档放在一个组中,这样我们就可以在第一步$match中应用累加器函数。你需要找的累加器函数是$min
、$max
和$avg
。IMongoCollection<Entity> collection = GetMyCollection();
DateTime minDate = default(DateTime); // define this yourself
DateTime maxDate = default(DateTime); // define this yourself
var match = new BsonDocument
{ {
"$match", new BsonDocument
{ {
"TimeStamp", new BsonDocument
{ {
"$and", new BsonDocument
{
{ "$gt", minDate },
{ "$lt", maxDate }
}
} }
} }
} };
var group = new BsonDocument
{ {
"$group", new BsonDocument
{
{ "_id", BsonNull.Value },
{ "min", new BsonDocument { { "$min", "Value" } } },
{ "max", new BsonDocument { { "$max", "Value" } } },
{ "avg", new BsonDocument { { "$avg", "Value" } } },
}
} };
var result = collection.Aggregate(PipelineDefinition<Entity, BsonDocument>.Create(match, group)).Single();
double min = result["min"].AsDouble;
double max = result["max"].AsDouble;
double avg = result["avg"].AsDouble;