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;
}
}
}
mongodb分组,的两种方式,先记一下的更多相关文章
- 不使用spring的情况下用java原生代码操作mongodb数据库的两种方式
由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常. 主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...
- List分组的两种方式
java8之前List分组 假设有个student类,有id.name.score属性,list集合中存放所有学生信息,现在要根据学生姓名进行分组. public Map<String, Lis ...
- python利用mongodb上传图片数据 : GridFS 与 bson两种方式
利用mongodb保存图片通常有两种方法,一种是将图片数据转化为二进制作为字典的键值对进行保存,另一种是利用mongodb提供的GridFS进行保存,两者各有利弊.性能方面的优劣未曾测试,无法进行评价 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 通过属性 Cesium的FBO主要支持两种方式
角色其实就是一类权限的分组,所以给用户分配角色其实也是在给用户分配权限.在oracle中有三个比较常用的角色.对于一般不是很严格的系统可以授予开发用户CONNECT.RESOURCE角色权限即可. 其 ...
- Log4Net日志记录两种方式
简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. log4net是Ap ...
- 基于Maven的SpringBoot项目实现热部署的两种方式
转载:http://blog.csdn.net/tengxing007/article/details/72675168 前言 JRebel是JavaEE中比较流行的热部署插件,可快速实现热部署,节省 ...
- SpringBoot从入门到精通二(SpringBoot整合myBatis的两种方式)
前言 通过上一章的学习,我们已经对SpringBoot有简单的入门,接下来我们深入学习一下SpringBoot,我们知道任何一个网站的数据大多数都是动态的,也就是说数据是从数据库提取出来的,而非静态数 ...
- SpringCloud系列-整合Hystrix的两种方式
Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力. 本文目录 一.H ...
- Spring Boot配置过滤器的两种方式
过滤器(Filter)是Servlet中常用的技术,可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,常用的场景有登录校验.权限控制.敏感词过滤等,下面介绍下Spring Boot配置过 ...
随机推荐
- 一款灵活好用的日历控件Kalendae
Kalendae是一款纯js不依赖任何js库的日历控件,可以轻松实现显示月份数量,当前选中多个日期,并可以按照周等你想要的格式去定制选中项. 下载地址:GitHub/Kalendae 第一步:Kale ...
- JS截取后缀名,文件全名,非后缀名的方法---收藏(冷饭_)
<script language="javascript" type="text/javascript"> //取整个文件的路径并且把文件名赋给文件 ...
- oracle imp导入数据到另一个表空间
http://blog.163.com/darlingchenlin@126/blog/static/7156283420100531431855/ 1.在第一个数据库导出数据:qlyg_xs_db_ ...
- (C#) 发布程序,包含某些配置文件或数据文件。
在VS2012里面,右击需要发布的Project,选择“Properties“, 在弹出的窗口里面点选”Publish“, 再点击”Application Files“, 将默认的Publish St ...
- Java的clone机制(及String的特殊性)
1. Clone&Copy 假设现在有一个Employee对象,Employee tobby =new Employee(“CMTobby”,5000),通常我们会有这样的赋值Employee ...
- android listView Exception
- ::-/com.tongyan.tutelage W/System.err﹕ java.text.ParseException: Unparseable date: ) - ::-/com.ton ...
- PLSQL_基础系列07_插入方式Pivoting / Unconditional / Conditional ALL / Conditional FIRST INSERT(案例)
2014-12-08 Created By BaoXinjian
- 【Java】图片高质量缩放类
package com.test; import com.sun.image.codec.jpeg.JPEGImageEncoder; import com.sun.image.codec.jpeg. ...
- contentProvider 内容提供者
http://blog.csdn.net/woshixuye/article/details/8280879 实例代码当数据需要在应用程序间共享时,我们就可以利用ContentProvider为数据定 ...
- tar.gz和rpm安装文件(转载)
from:http://bbs.chinaunix.net/thread-2277750-1-1.html Linux软件的二进制分发是指事先已经编译好二进制形式的软件包的发布形式,其优点是安装使用容 ...