MongoDB每月分组

时间:2017-09-17 21:09:09

标签: c# mongodb mongodb-query aggregation-framework bson

我尝试按月对值进行分组,并获得每个月的平均值。

这是我使用的聚合方法

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,
}

1 个答案:

答案 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。