我尝试按月对值进行分组,并获得每个月的平均值。
这是我使用的聚合方法
var aggregateArgs = new AggregateArgs();
aggregateArgs.Pipeline =
new[]
{
new BsonDocument{{ "$match", new BsonDocument
{{ "_Timestamp", new BsonDocument {
{"$gte", _start}, // start date is 2016-08-04T23:15:00.000+01:00
{"$lt", _end}// end date is 2017-09-04T23:15:00.000+01:00
}}}
}},
new BsonDocument("$project",
new BsonDocument
{
{ "_id" , 0 },
{ "new_range", new BsonDocument {
{"year", new BsonDocument("$year", "$_Timestamp")},
{"month", new BsonDocument("$month", "$_Timestamp")},
}
}
}
),
new BsonDocument("$group",
new BsonDocument
{
{"_id", "$new_range" },
{"MonthlyAverage", new BsonDocument("$avg", "$totalfundspent")},
}),
};
但我得到了这个
"枚举没有产生任何结果"
我做错了什么?我的MongoDB版本是3.4.4
我的文件示例
{
"_Timestamp" : ISODate("2017-08-04T23:15:00.000+01:00"),
"totalfundspent" : 1138.0,
}
{
"_Timestamp" : ISODate("2017-08-05T23:15:00.000+01:00"),
"totalfundspent" : 638.0,
}
答案 0 :(得分:1)
我认为问题是日期没有被解析为ISODate("2016-08-04T23:15:00.000+01:00")
,将其转换为DateTime并将其传递给BsonDocument确保确实发生了。
var _start = Convert.ToDateTime("2016-08-04T23:15:00.000+01:00");
var _end = Convert.ToDateTime("2017-09-04T23:15:00.000+01:00");
var match = new BsonDocument {
{
"_Timestamp",
new BsonDocument {
{
"$gte", _start
}, {
"$lt", _end
}
}
}
};
var project = new BsonDocument {
{
"_id",
0
}, {
"new_range", new BsonDocument {
{
"year", new BsonDocument("$year", "$_Timestamp")
},
{
"month",
new BsonDocument("$month", "$_Timestamp")
},
}
}
};
var group = new BsonDocument {
{
"_id",
"$new_range"
}, {
"MonthlyAverage", new BsonDocument("$avg", "$totalfundspent")
}
};
var result = this.coll.Aggregate().Match(match).Project(project).Group(group).ToList();
如果您希望调试查询,可以在.ToString()
之前调用.ToList()
,如此
var jsonQuery = this.coll.Aggregate().Match(match).Project(project).Group(group).ToString();
这为您提供了一个json文档,您可以使用它来自己查询Mongo。