zoukankan      html  css  js  c++  java
  • mongodb分组,的两种方式,先记一下

    using MongoDB.Bson;
    using MongoDB.Driver;
    using MongoDB.Driver.Builders;
    using NationalUnion.AdGallery.Model;
    using NationalUnion.Common.Utility;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace NationalUnion.AdGallery.DALMongo
    {
        public class AdUVDAL
        {
            /// <summary>
            /// 查找日期范围内的UV量
            /// </summary>
            /// <param name="argSatartDate"></param>
            /// <param name="argEndDate"></param>
            /// <returns></returns>
            public List<AdIDWIDSID> GetUVGroupBySID(DateTime argSatartDate, DateTime argEndDate)
            {
                var vMongoClient = new MongoClient(ConstUtinity.MongoDBCon);
                var vServer = vMongoClient.GetServer();
                var vDataBase = vServer.GetDatabase(ConstUtinity.DATABASE);
                var vCollection = vDataBase.GetCollection<AdUV>(ConstUtinity.ADUVCOL);
    
                var vQueryDateStart = Query<AdUV>.GTE(x => x.CrateDate, argSatartDate);
                var vQueryDateEnd = Query<AdUV>.LTE(x => x.CrateDate, argEndDate);
    
                IMongoQuery vQuery = Query.And(vQueryDateStart, vQueryDateEnd);
                Dictionary<string, int> InitailDIC = new Dictionary<string, int>();
                InitailDIC["num"] = 0;
                var vQuryble = vCollection.Group(vQuery, "SID",
                     BsonDocument.Create(InitailDIC),
                new BsonJavaScript("function(doc,prev){prev.num++;}"),
                 new BsonJavaScript("function(doc,out){doc.Count=doc.num;delete doc.num }"));
    
                List<AdIDWIDSID> vAdIDWIDList = new List<Model.AdIDWIDSID>();
                foreach (var item in vQuryble)
                {
                    vAdIDWIDList.Add(new AdIDWIDSID()
                    {
                        SID = item["SID"].AsInt(),
                        Count = item["Count"].AsInt()
                    });
                }
                return vAdIDWIDList;
            }
    
            /// <summary>
            /// 查找日期范围内的各站点UV量
            /// </summary>
            /// <param name="argSatartDate"></param>
            /// <param name="argEndDate"></param>
            /// <param name="SID"></param>
            /// <returns></returns>
            public List<AdIDWIDSID> GetSiteUV(DateTime argSatartDate, DateTime argEndDate,int SID)
            {
                var vMongoClient = new MongoClient(ConstUtinity.MongoDBCon);
                var vServer = vMongoClient.GetServer();
                var vDataBase = vServer.GetDatabase(ConstUtinity.DATABASE);
                var vCollection = vDataBase.GetCollection<AdUV>(ConstUtinity.ADUVCOL);
    
                var vSIDQuery = Query<AdUV>.EQ(x => x.SID, SID);
                var vQueryDateStart = Query<AdUV>.GTE(x => x.CrateDate, argSatartDate);
                var vQueryDateEnd = Query<AdUV>.LTE(x => x.CrateDate, argEndDate);
    
                IMongoQuery vQuery = Query.And(vQueryDateStart, vQueryDateEnd, vSIDQuery);
                Dictionary<string, int> InitailDIC = new Dictionary<string, int>();
                InitailDIC["num"] = 0;
                var vQuryble = vCollection.Group(vQuery, "WID",
                     BsonDocument.Create(InitailDIC),
                new BsonJavaScript("function(doc,prev){prev.num++;}"),
                 new BsonJavaScript("function(doc,out){doc.Count=doc.num;delete doc.num }"));
    
                List<AdIDWIDSID> vAdIDWIDList = new List<Model.AdIDWIDSID>();
                foreach (var item in vQuryble)
                {
                    vAdIDWIDList.Add(new AdIDWIDSID()
                    {
                        WID = item["WID"].AsInt(),
                        Count = item["Count"].AsInt()
                    });
                }
                return vAdIDWIDList;
            }
            
            /// <summary>
            /// 根据日期范围和SID对数据FeedBack分组
            /// </summary>
            /// <param name="argSatartDate"></param>
            /// <param name="argEndDate"></param>
            /// <param name="SID"></param>
            /// <returns></returns>
            public List<AdIDWIDSID> GetUVGroupByFeedBack(DateTime argSatartDate, DateTime argEndDate, int SID)
            {
                var vMongoClient = new MongoClient(ConstUtinity.MongoDBCon);
                var vServer = vMongoClient.GetServer();
                var vDataBase = vServer.GetDatabase(ConstUtinity.DATABASE);
                var vCollection = vDataBase.GetCollection<AdUV>(ConstUtinity.ADUVCOL);
    
                var vSIDQuery = Query<AdUV>.EQ(x => x.SID, SID);
                var vQueryDateStart = Query<AdUV>.GTE(x => x.CrateDate, argSatartDate);
                var vQueryDateEnd = Query<AdUV>.LTE(x => x.CrateDate, argEndDate);
    
                IMongoQuery vQuery = Query.And(vQueryDateStart, vQueryDateEnd, vSIDQuery);
                string mapfunction = @"function Map() {
                                            if(this.FeedBack.length>0)
                                            {
    	                                        var FeedBackID=this.FeedBack.split('|');
    	                                        if(FeedBackID.length>0)
    	                                        {
    		                                        emit(FeedBackID[0],{count:1});
    	                                        }
                                            }
                                      }";
                string reducefunction = @"function Reduce(key, values) {
    	                                var count=0;
    	                                for(var i=0;i<values.length;i++){
    		                                count+=[values].count;
    	                                }
    	                                return {FeedBack:key,UV:count};
                                    }";
                
                BsonJavaScript vMaP = new BsonJavaScript(mapfunction);
                BsonJavaScript vreduce = new BsonJavaScript(reducefunction);
                MapReduceResult vResult = vCollection.MapReduce(vQuery, vMaP, vreduce);
    
                return null;
            }
    
            /// <summary>
            /// 查找日期范围内产生UV的各个页面类型名
            /// </summary>
            /// <param name="argSatartDate"></param>
            /// <param name="argEndDate"></param>
            /// <param name="argPageType"></param>
            /// <param name="SID"></param>
            /// <param name="argUrl"></param>
            /// <returns></returns>
            public List<AdIDWIDSID> GetGomePageUV(DateTime argSatartDate, DateTime argEndDate, int argPageType, int SID, string argUrl)
            {
                var vMongoClient = new MongoClient(ConstUtinity.MongoDBCon);
                var vServer = vMongoClient.GetServer();
                var vDataBase = vServer.GetDatabase(ConstUtinity.DATABASE);
                var vCollection = vDataBase.GetCollection<AdUV>(ConstUtinity.ADUVCOL);
    
                var vQueryDateStart = Query<AdUV>.GTE(x => x.CrateDate, argSatartDate);
                var vQueryDateEnd = Query<AdUV>.LTE(x => x.CrateDate, argEndDate);
    
                IMongoQuery vQuery = Query.And(vQueryDateStart, vQueryDateEnd);
                if (SID > 0)
                {
                    var vQuerySID = Query<AdUV>.EQ(x => x.SID, SID);
                    vQuery = Query.And(vQuery, vQuerySID);
                }
                if (!string.IsNullOrWhiteSpace(argUrl))
                {
                    var vQueryRawUrl = Query<AdUV>.EQ(x => x.RootUrl, argUrl);
                    vQuery = Query.And(vQuery, vQueryRawUrl);
                }
    
                if (argPageType > -1)
                {
                    var vQueryPageType = Query<AdUV>.EQ(x => x.PageType, argPageType);
                    vQuery = Query.And(vQuery, vQueryPageType);
                }
    
                Dictionary<string, int> InitailDIC = new Dictionary<string, int>();
                InitailDIC["num"] = 0;
                var vQuryble = vCollection.Group(vQuery, "PageType",
                     BsonDocument.Create(InitailDIC),
                new BsonJavaScript("function(doc,prev){prev.num++;}"),
                 new BsonJavaScript("function(doc,out){doc.Count=doc.num;delete doc.num }"));
    
                List<AdIDWIDSID> vAdIDWIDList = new List<Model.AdIDWIDSID>();
                foreach (var item in vQuryble)
                {
                    vAdIDWIDList.Add(new AdIDWIDSID()
                    {
                        PageType = item["PageType"].AsInt(),
                        Count = item["Count"].AsInt()
                    });
                }
                return vAdIDWIDList;
            }
    
    
            /// <summary>
            /// 查找日期范围内单品的UV
            /// </summary>
            /// <param name="argSatartDate"></param>
            /// <param name="argEndDate"></param>
            /// <param name="argPageType"></param>
            /// <param name="SID"></param>
            /// <param name="argUrl"></param>
            /// <returns></returns>
            public List<ResultModel> GetProductUV(DateTime argSatartDate, DateTime argEndDate, int argPageType, int argSID, string argUrl)
            {
                var vMongoClient = new MongoClient(ConstUtinity.MongoDBCon);
                var vServer = vMongoClient.GetServer();
                var vDataBase = vServer.GetDatabase(ConstUtinity.DATABASE);
                var vCollection = vDataBase.GetCollection<AdUV>(ConstUtinity.ADUVCOL);
    
                #region march
                BsonDocument vMarchBson = new BsonDocument { 
                    {"CrateDate", new BsonDocument { 
                        { "$gte", argSatartDate },
                        { "$lte", argEndDate } } 
                    }
                };
                if (argPageType > -1)
                {
                    vMarchBson.AddRange(new BsonDocument { 
                        {"PageType",argPageType}
                    });
                }
                if (argSID > 0)
                {
                    vMarchBson.AddRange(new BsonDocument { 
                        {"SID",argSID}
                    });
                }
    
                if (!string.IsNullOrWhiteSpace(argUrl))
                {
                    vMarchBson.AddRange(new BsonDocument { 
                        {"RootUrl",argUrl}
                    });
                }
    
                BsonDocument vMatch = new BsonDocument();
                vMatch.AddRange(new BsonDocument { { "$match", vMarchBson } });
                #endregion
                BsonDocument vBsonLimit = new BsonDocument{
                    {"$limit",50}
                 };
    
                BsonDocument vBsonGroup = new BsonDocument{
                    {"$group",new BsonDocument{
                        {"_id",new BsonDocument{{"RootUrl","$RootUrl"}}},
                        {"Count",new BsonDocument{{"$sum",1}}}
                        }
                    }
                 };
    
                BsonDocument vBsonSort = new BsonDocument { 
                   {"$sort",new BsonDocument{{"Count",-1}}}
                };
    
    
                 AggregateArgs vAggregateArgs = new AggregateArgs();
                 List<BsonDocument> vBsonDocumentList = new List<BsonDocument>();
                 vBsonDocumentList.Add(vMatch);
                 vBsonDocumentList.Add(vBsonLimit);
                 vBsonDocumentList.Add(vBsonGroup);
                 vBsonDocumentList.Add(vBsonSort);
    
                 vAggregateArgs.Pipeline = vBsonDocumentList;
                 var vResult = vCollection.Aggregate(vAggregateArgs);
    
    
                 List<ResultModel> vResultModelList = new List<ResultModel>();
                 foreach (var item in vResult)
                 {
                     vResultModelList.Add(new ResultModel()
                     {
                         RootUrl = item["_id"]["RootUrl"].AsString(),
                         Count = item["Count"].AsInt()
                     });
                 }
    
                 return vResultModelList;
            } 
        }
    }
    
  • 相关阅读:
    vim字符串替换命令
    Android中View的事件分发机制——Android开发艺术探索笔记
    jQuery源代码框架思路
    C指针——C语言手记
    Python基础二--基本控制语句
    C++中的链式操作
    求一个字串中最长的连续字符串
    C# -- 推断字符能否转化为整形
    Loadrunner检查点使用总结
    LoadRunner设置检查点的几种方法介绍
  • 原文地址:https://www.cnblogs.com/xuxu-dragon/p/4088852.html
Copyright © 2011-2022 走看看