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

mongodb分组,的两种方式,先记一下的更多相关文章

  1. 不使用spring的情况下用java原生代码操作mongodb数据库的两种方式

    由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常.   主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...

  2. List分组的两种方式

    java8之前List分组 假设有个student类,有id.name.score属性,list集合中存放所有学生信息,现在要根据学生姓名进行分组. public Map<String, Lis ...

  3. python利用mongodb上传图片数据 : GridFS 与 bson两种方式

    利用mongodb保存图片通常有两种方法,一种是将图片数据转化为二进制作为字典的键值对进行保存,另一种是利用mongodb提供的GridFS进行保存,两者各有利弊.性能方面的优劣未曾测试,无法进行评价 ...

  4. 《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  5. 通过属性 Cesium的FBO主要支持两种方式

    角色其实就是一类权限的分组,所以给用户分配角色其实也是在给用户分配权限.在oracle中有三个比较常用的角色.对于一般不是很严格的系统可以授予开发用户CONNECT.RESOURCE角色权限即可. 其 ...

  6. Log4Net日志记录两种方式

     简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.     log4net是Ap ...

  7. 基于Maven的SpringBoot项目实现热部署的两种方式

    转载:http://blog.csdn.net/tengxing007/article/details/72675168 前言 JRebel是JavaEE中比较流行的热部署插件,可快速实现热部署,节省 ...

  8. SpringBoot从入门到精通二(SpringBoot整合myBatis的两种方式)

    前言 通过上一章的学习,我们已经对SpringBoot有简单的入门,接下来我们深入学习一下SpringBoot,我们知道任何一个网站的数据大多数都是动态的,也就是说数据是从数据库提取出来的,而非静态数 ...

  9. SpringCloud系列-整合Hystrix的两种方式

    Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力. 本文目录 一.H ...

  10. Spring Boot配置过滤器的两种方式

    过滤器(Filter)是Servlet中常用的技术,可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,常用的场景有登录校验.权限控制.敏感词过滤等,下面介绍下Spring Boot配置过 ...

随机推荐

  1. linux awk命令

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  2. 黄聪:让WordPress主题支持语言本地化(使用poedit软件实现中文翻译功能)

    如果你的WordPress主题要提交到WordPress官方主题库,使用者来自世界各地的多种语言,那么,你就要让你的WordPress主题支持语言本地化,方便使用者进行语言翻译和制作语言包. 让Wor ...

  3. [Serializable]的应用--注册码的生成,加密和验证

    1.首先定义注册类RegisterEntity [Serializable] public class RegisterEntity { public string RegisterKey; publ ...

  4. Spark on Yarn 架构解析

    . 一.Hadoop Yarn组件介绍: 我们都知道yarn重构根本的思想,是将原有的JobTracker的两个主要功能资源管理器 和 任务调度监控 分离成单独的组件.新的架构使用全局管理所有应用程序 ...

  5. Spark运行流程概述

    Application 指用户编写的Spark应用程序,其中包含了一个Driver功能的代码和分布在集群中多个节点上运行的Executor代码. Driver Spark中的Driver即运行上述Ap ...

  6. Codeforces Round #364 (Div. 2) Cells Not Under Attack

    Cells Not Under Attack 题意: 给出n*n的地图,有给你m个坐标,是棋子,一个棋子可以把一行一列都攻击到,在根据下面的图,就可以看出让你求阴影(即没有被攻击)的方块个数 题解: ...

  7. EXISTS、EXCEPT、INTERSECT 运算符

    转:http://www.cnblogs.com/WizardWu/archive/2011/10/01/2197147.html EXISTS运算符 EXISTS 可称之为运算符,有些书称它为关键词 ...

  8. 格式化日期的js(正则魅力)

      /** * 时间对象的格式化; */ Date.prototype.format = function(format) { // ◆ 使用prototype定义原型方法 /* * eg:forma ...

  9. 采访ServiceStack的项目领导Demis Bellot——第1部分(转)

    ServiceStack是一个开源的.支持.NET与Mono平台的REST Web Services框架.InfoQ有幸与Demis Bellot深入地讨论了这个项目.在这篇两部分报道的第1部分中,我 ...

  10. SQL Server 2005中的分区表(六):将已分区表转换成普通表(转)

    我的俄罗斯名叫作“不折腾不舒服斯基”,所以,不将分区表好好折腾一下,我就是不舒服. 在前面,我们介绍过怎么样直接创建一个分区表,也介绍过怎么将一个普通表转换成一个分区表.那么,这两种方式创建的表有什么 ...