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; } } }
时间: 2024-10-17 10:47:27