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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。