zoukankan      html  css  js  c++  java
  • MongoDB.Driver 中通过管道(Aggregate)实现分组功能查询出符合条件的数据

    举例:查询出 同一IP一天内点击专线消耗竞价物流币的量

    关键点:

        1、怎么取出当天的数据? 

         2、怎样实现根据IP分组,并且计算出消耗的物流币总数量?

    步骤:

    1、返回当天零点的时间戳

                DateTime now = DateTime.Now;
                DateTime now_0 = new DateTime(now.Year, now.Month, now.Day);
                long unixtemp = 0;
                string TheTimeStamp = TimeHelper.GetTimeStamp(now_0);
                if (!long.TryParse(TheTimeStamp, out unixtemp))
                {
                    return 0;
                }

    2、创建查询管道

                string pipelineJson1 = " { $match : {ip:'" + ip + "',state:1,unixTime:{$gte:" + unixtemp + "}} }";
                string pipelineJson2 = @"{$group:{_id:'$ip',all_jingjiapx:{$sum:{$add:['$jingjia_PX','$basic_PX']}}}} ";
    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); var pipeline = new PipelineStagePipelineDefinition<BsonDocument, BsonDocument>(stages);

    3、执行查询

     var a = MongoDbHelper.GetDb().GetCollection<BsonDocument>("PageColllection").Aggregate(pipeline).ToList();

    4、从返回的结果中查询出消耗的物流币总量

    a[0].GetElement("all_jingjiapx").Value.ToString().Length > 0 ? Convert.ToInt32(a[0].GetElement("all_jingjiapx").Value.ToString()) : 0;

    整个方法如下所示

    /// <summary>
            /// 规则 :
            /// 同一IP一天内点击专线消耗竞价物流币的量
            /// </summary>
            /// <param name="ip"></param>
            /// <returns></returns>
            public int AntiEvilclickRuleSeven(string ip)
            {
                DateTime now = DateTime.Now;
                DateTime now_0 = new DateTime(now.Year, now.Month, now.Day);
                long unixtemp = 0;
                string TheTimeStamp = TimeHelper.GetTimeStamp(now_0);
                if (!long.TryParse(TheTimeStamp, out unixtemp))
                {
                    return 0;
                }
                string pipelineJson1 = " { $match : {ip:'" + ip + "',state:1,unixTime:{$gte:" + unixtemp + "}} }";
                string pipelineJson2 = @"{$group:{_id:'$ip',all_jingjiapx:{$sum:{$add:['$jingjia_PX','$basic_PX']}}}} ";
                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);
                var pipeline = new PipelineStagePipelineDefinition<BsonDocument, BsonDocument>(stages);
    
                var a = MongoDbHelper.GetDb().GetCollection<BsonDocument>("PageColllection").Aggregate(pipeline).ToList();
    
                if (a.Count <= 0)
                {
                    return 0;
                }
                else
                {
                    return a[0].GetElement("all_jingjiapx").Value.ToString().Length > 0 ? Convert.ToInt32(a[0].GetElement("all_jingjiapx").Value.ToString()) : 0;
                }
    
            }
  • 相关阅读:
    如何更好地理解闭包
    抽象类和抽象方法以及和接口区别
    JavaScript中如何理解如何理解Array.apply(null, {length:5})
    Java线程中的同步
    Python前世今生以及种类、安装环境
    大数据中的用户画像
    Java web每天学之Servlet工作原理详情解析
    Go语言操作MySQL数据库
    老集群RAC双网卡绑定
    nmcli配置ipv6
  • 原文地址:https://www.cnblogs.com/Learnall/p/14343565.html
Copyright © 2011-2022 走看看