.NET 官方驱动MongoDB.Driver的聚合管道Aggregate用法(二)之操作符的用法示例及细节

上一篇文章写了如何去写一个聚合管道的类以及实例化后的基本查询实现。传送门

本文笔者想记录在具体实现按日期统计数据进行Aggregate时,在编写查询条件时的一些容易忽略的小细节(笔者自己忽略的和遇到的问题)进行记录,以备后用,错误之处,请留言指正。

1.时间问题

             //ISODate的时间是UTC时间,所以做查询的时候需要北京时间减去8小时,转字符串,在用ISODate处理成$match条件
            //普通查询
            DateTime dtLimit = DateTime.Parse("2018-12-01 00:00:01");
            dtLimit= dtLimit.AddHours(-8);
            string utcDate = dtLimit.ToString("yyyy-MM-ddTHH:mm:ss");
            string pipelineJson1 = " {$project : {DTime : 1 ,AdvInf : 1}}";
            string pipelineJson2 = " { $match : { DTime : { $gte :ISODate('"+ utcDate + "') } } }";

            IList<IPipelineStageDefinition> stages = new List<IPipelineStageDefinition>();
            PipelineStageDefinition<BsonDocument, BsonDocument> stage1 =
                new JsonPipelineStageDefinition<BsonDocument, BsonDocument>(pipelineJson1);
            PipelineStageDefinition<BsonDocument, BsonDocument> stage2=
                new JsonPipelineStageDefinition<BsonDocument, BsonDocument>(pipelineJson2);

            stages.Add(stage1);
            stages.Add(stage2);
    
            PipelineDefinition<BsonDocument, BsonDocument> pipeline = new PipelineStagePipelineDefinition<BsonDocument, BsonDocument>(stages);
            MongoHelper operatDb = new MongoHelper();
            MongoDBAggregate mongo = new MongoDBAggregate("mongodb://192.168.5.99:101");

            var result = mongo.GetAggregate("EHQQDZ309", "201812", pipeline).ToList();

时间转换:$match中的时间条件比较,必须将时间使用ISODate()进行处理。且ISODate函数的时间字符串,如果涉及时分秒,其字符串参数格式必须是0000-00-00T00:00:00。

时区问题:大家知道MongoDB中,默认使用的UTC时间,而我们日常开始的时间是北京时间,领先UTC 8个小时,即UTC时间=北京时间+8小时。如果我们将时间作为查询条件,那么需要将目标的时间(北京时间)减去8个小时,再转换处理后,输入到$match操作符中。举例讲,就是如果 我要查询2018-12-1 00:00:01时开始至今的数据,假设该时间点存在一条记录,那么其实这个其实记录在MongoDB中存储的时间戳应该是2018-11-30 16:00:01。所以我们需要将2018-12-1 00:00:01的变量减去8小时,生成字符串“2018-11-30T16:00:01”,当输入到$match操作附中的ISODate函数实际转换时,就将其转换成了“2018-10-31T16:00:05.000Z”,注意后面的Z,表示UTC时间,那查询的条件就是UTC时间大于“2018-10-31T16:00:05.000Z”的记录,即大于北京时间“2018-12-1 00:00:01”的记录。

补充:UTC是协调世界时(Universal Time Coordinated)英文缩写,是由国际无线电咨询委员会规定和推荐,并由国际时间局(BIH)负责保持的以秒为基础的时间标度。UTC相当于本初子午线(即经度0度)上的平均太阳时,过去曾用格林威治平均时(GMT)来表示.北京时间比UTC时间早8小时,以1999年1月1日0000UTC为例,UTC时间是零点,北京时间为1999年1月1日早上8点整。

2.$Sort的用法

①统计12月份每天数据存储的数量

 //数据统计
 string pipelineJson1= " { $match : { DTime : { $gte :ISODate('2018-10-04T02:20:12') } } }";
 string pipelineJson2 = "{$group:{_id:{month:{$month:'$DTime'},day:{$dayOfMonth:'$DTime'}}, count: {$sum:1},total:{$sum:'xStepCounter'}}}";
 string pipelineJson3 = " {$sort:{_id:1}}";  //升序

笔者想按日期排序,因为这个Collection(表)中只有12月的数据,所以排序的代码谢伟 string pipelineJson3 = " {$sort:{day:1}}",执行不会报错,结果顺序并没有按照日期排列。

改为上面代码段中的 string pipelineJson3 = " {$sort:{_id:1}}"  ,按_id升序排列,结果正确。

猜你喜欢

转载自blog.csdn.net/iandbeyond/article/details/84849522