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. rdynamic和-whole-archive

    遇到如下情况,主程序通过dlopen来打开.so文件,但是.so用到了主程序的log函数. 编译so时,通过引用主程序头文件来编译通过,头文件有log函数声明: extern "C" ...

  2. apache配置常用模块

    需要加载的模块列表 LoadModule php5_module modules/libphp5.so LoadModule actions_module modules/mod_actions.so ...

  3. maven下载的jar文件出现invalid LOC header (bad signature)

    有的时候maven下载了相对应的jar文件,但是某些类无法被引入,在eclipse打开该jar文件,发现相对应的类是invalid LOC header (bad signature),这时把mave ...

  4. 如何利用svn自动同步更新到网站服务器

    我们最终的目的是:当本地提交后,SVN服务器自动更新服务器端指定WEB目录内的文件 实现方法: 找到服务器端 SVN版本库所在的目录(目录名称是Repositories),这个目录是在安装Visual ...

  5. MemcacheQ 的安装与使用

    1.安装libevent 官网:http://www.libevent.org/ 全选复制放进笔记 $ wget https://github.com/downloads/libevent/libev ...

  6. java生成验证码图片

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, ...

  7. linux shell 参数传递

    在shell编程时.可以使用参数.Shell有位置参数和内部参数 1. 位置参数 由系统提供的参数称为位置参数.位置参数的值可以用$N得到,N是一个数字,如果为1,即$1.类似C语言中的数组,Linu ...

  8. android 列表开发 ListView

    1.android 端 二个entity consultInfo: private String name; private String id; consultInfoRef private iLi ...

  9. [ActionScript 3.0] AS3.0 给flash事件传递参数的方法

    有时我们想要给flash内置的事件(比如MouseEvent)传递参数,这时我们可以用到下面的方法. import flash.events.MouseEvent; mc.addEventListen ...

  10. Innosetup中将bat文件压缩到压缩包中

      有时候在安装的过程中需要调用某些文件(bat或者exe等文件),但是只需要使用一次,然后就可以删掉该文件, 在Innosetup中应该这样操作: 1.在.iss脚本的[Files]章节写下: So ...