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

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

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

由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常.   主要原因实际上是和mongodb本身无关的,因为他们改的是配置文件的密码,而实际上这个密码在代码中根本就没有使用,他们在代码中已经把用户验证信息写死.   在协助他们解决这个问题的时候,我看到他们代码中在和mongodb数据库交互时使用了已经不被建议使用的方法,于是便抽时间尝试了一下另一种被建议的方式实现各功能.   当然了,生产环境中用的是mongodb集群

MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码

先来张在路上-- 此项目是用Maven创建的,没有使用Maven的,自己百度.谷歌去:直接用Junit测试就行,先执行里面的save方法,添加10000条测试数据提供各种聚合查询等. 废话不多说,上干货-- 一.MongoDB数据库的配置(mongodb.xml) 以下是我自己的配置,红色字体请改为自己本机的东东,你说不懂设置端口,不会创建数据库名称,不会配置用户名密码,那有请查阅本系列的第4节(MongoDB的使用学习之(四)权限设置--用户名.密码.端口==),你说懒得设置,那就@#¥%--

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

利用mongodb保存图片通常有两种方法,一种是将图片数据转化为二进制作为字典的键值对进行保存,另一种是利用mongodb提供的GridFS进行保存,两者各有利弊.性能方面的优劣未曾测试,无法进行评价,此处仅对两种方式进行介绍,若有彻知者还望指教. 下面以如下数据作为示例进行介绍: 数据示例 dic = { "owner_name" : "samssmilin", "photo_id" : "602880671", "

jsp中include的两种方式

一.前言 身为一名coder有太多太多的知识点要去学,太多太多的东西要去记.往往一些小细节也就难免疏忽,但悲催的是多数困恼你的bug就是因为这些微不足道的知识点.我们又不是机器人,怎么可能什么都记得了呢.更多的是遇到问题->解决问题->成为经验,这种提升模式.其实多去交流,多去分享,在你还未遇到问题之前就能预先知晓解决方法,或许提升的更快. 二.JSP中include的两种方法 1.include指令: <%@include file="文件的绝对路径或者相对路径"%

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

1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架ServerSuperIO教程>2.服务实例的配置参数说明 <连载 | 物联网框架ServerSuperIO教程>- 3.设备驱动介绍 <连载 | 物联网框架ServerSuperIO教程>-4.如开发一套设备驱动,同时支持串口和网络通讯. <连载 | 物联网框架ServerSupe

Log4Net日志记录两种方式

本文转载:http://www.cnblogs.com/wolf-sun/p/3347373.html#3009010 简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.     log4net是Apache软件基金会Apache Logging Services工程的一部分.Apache日志服务工程致力于为程序调试和审计提供跨语言的日志服务.(f:百度百科) 原理 Log4ne

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

角色其实就是一类权限的分组,所以给用户分配角色其实也是在给用户分配权限.在oracle中有三个比较常用的角色.对于一般不是很严格的系统可以授予开发用户CONNECT.RESOURCE角色权限即可. 其中--logdir命令行参数指定的路径必须跟SummaryWriter的logdir参数值保持一致,TensorBoard才能够正确读取到Tensorflow的事件文件. 使用RTTI技术可以避免类型访问错误而程序异常的情况,但是这样做有点不优雅,每增加一个类型,都需要修改if-else结构,并且使

em创建的两种方式

em创建(两种方式1,图形dbca,当然了,前提是先创建一个监听. 2,手工命令安装em)手工命令创建em(确保数据库开启,确保监听正常并且最好是动态监听,确保system表空间够用大概1G左右),我的空间有限只给了800M,如下 select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name like 'SYSTEM';alter database datafile '/u01

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 选择调用的进程为 24 i386 getuid sys_getuid1647 i386 getgid sys_getgid16 使用库函数API方式 使用C代码中嵌入汇编代码方式

Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态.然后等待消费者消费了商品,然后消费者通知生产者队列有空间了.同样地,当