例子:

public static void getUserRFM(DateTime beginTime, DateTime endTime)
        {
            MongoDatabase mongoDB = getConnection();

//会员消费明细的实体类
            List<Ky_Shopplist> shopplist = new List<Ky_Shopplist>();

//获得Ky_shopplist集合
            MongoCollection col = mongoDB.GetCollection("Ky_Shopplist");

//获得Ky_UserRFM的集合
            MongoCollection colRFM = mongoDB.GetCollection("Ky_UserRFM");

//删除Ky_UserRFM集合中所有的数据
            colRFM.RemoveAll();

//定义获取“buyTime”相关的查询条件
            var query = Query.And(Query.GTE("buyTime", beginTime.ToString("yyyy-MM-dd HH:mm:ss")), Query.LTE("buyTime", endTime.ToString("yyyy-MM-dd HH:mm:ss")));

//var result = col.FindAs<Ky_Shopplist>(query).ToList();
            //var result_all = col.FindAllAs<Ky_Shopplist>().ToList();

//会员RFM值实体类
            List<Ky_UserRFM> userRFMlist = new List<Ky_UserRFM>();

//GroupBy的字段
            GroupByBuilder groupbyBuilder = new GroupByBuilder(new string[] { "userId" });

#region 计算会员R值

try
            {

//计算每组UserId的最大时间
                Dictionary<string, string> dic_R = new Dictionary<string, string>();
                dic_R["time"] = DateTime.Now.ToString();
                var result_R = col.Group(query, groupbyBuilder, BsonDocument.Create(dic_R),
                                    BsonJavaScript.Create("function(obj,prev){if(prev.time>obj.buyTime){prev.time=obj.buyTime;}}"),
                                    BsonJavaScript.Create("function(obj){ obj.btime=obj.time;delete obj.time; }")).ToList();

if (result_R.Count != 0)
                 {
                    //计算出会员距今最近的消费时间和最远的消费时间
                    DateTime Mintime = DateTime.Now;
                    DateTime Maxtime = DateTime.Now;
                    for (int i = 1; i < result_R.Count; i++)
                    {
                        if (i == 1)
                        {
                            Maxtime = Convert.ToDateTime(result_R[i]["btime"]) > Convert.ToDateTime(result_R[0]["btime"]) ? Convert.ToDateTime(result_R[i]["btime"]) : Convert.ToDateTime(result_R[0]["btime"]);

Mintime = Convert.ToDateTime(result_R[i]["btime"]) < Convert.ToDateTime(result_R[0]["btime"]) ? Convert.ToDateTime(result_R[i]["btime"]) : Convert.ToDateTime(result_R[0]["btime"]);

}
                        else
                        {
                            Maxtime = Maxtime > Convert.ToDateTime(result_R[i]["btime"]) ? Maxtime : Convert.ToDateTime(result_R[i]["btime"]);

Mintime = Mintime < Convert.ToDateTime(result_R[i]["btime"]) ? Mintime : Convert.ToDateTime(result_R[i]["btime"]);
                        }
                    }

double R_interval = 0.0;
                    R_interval = (Maxtime - Mintime).TotalSeconds / 5;

//计算会员R值
                    for (int i = 0; i < result_R.Count; i++)
                    {
                        DateTime dtTime = Convert.ToDateTime(result_R[i]["btime"]);
                        string userId = result_R[i]["userId"].ToString();
                        string struser_R = "0";

if (dtTime >= Mintime && dtTime <= Mintime.AddSeconds(R_interval))
                        {
                            struser_R = "1";
                        }
                        if (dtTime >= Mintime.AddSeconds(R_interval) && dtTime <= Mintime.AddSeconds(R_interval * 2))
                        {
                            struser_R = "2";
                        }
                        if (dtTime >= Mintime.AddSeconds(R_interval * 2) && dtTime <= Mintime.AddSeconds(R_interval * 3))
                        {
                            struser_R = "3";
                        }
                        if (dtTime >= Mintime.AddSeconds(R_interval * 3) && dtTime <= Mintime.AddSeconds(R_interval * 4))
                        {
                            struser_R = "4";
                        }
                        if (dtTime >= Mintime.AddSeconds(R_interval * 4) && dtTime <= Maxtime)
                        {
                            struser_R = "5";
                        }

Ky_UserRFM userRFM = new Ky_UserRFM();

userRFM.user_R = struser_R;
                        userRFM.user_F = "0";
                        userRFM.user_M = "0";

userRFM.user_Tagid = "";
                        userRFM.user_Id = userId;
                        userRFM.current_Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

userRFMlist.Add(userRFM);
                    }

//批量插入会员RFM表
                    colRFM.InsertBatch(typeof(Ky_UserRFM), userRFMlist);
                }
            }
            catch (Exception ex)
            {
                throw;
            }

#endregion

#region 计算会员F值

try
            {

      //计算每组UserId的次数

Dictionary<string, int> dic_F = new Dictionary<string, int>();
                dic_F["num"] = 0;
                var result_F = col.Group(query, groupbyBuilder, BsonDocument.Create(dic_F),
                                               BsonJavaScript.Create("function(doc,prev){prev.num++;}"),
                                               BsonJavaScript.Create("function(doc){ doc.count=doc.num;delete doc.num; }")).ToList();

if (result_F.Count != 0)
                {
                    //计算出会员最大消费频率和最小消费频率
                    double Maxcount = 0;
                    double Mincount = 0;
                    for (int i = 1; i < result_F.Count; i++)
                    {
                        if (i == 1)
                        {
                            Maxcount = Convert.ToInt32(result_F[i]["count"]) > Convert.ToInt32(result_F[0]["count"]) ? Convert.ToInt32(result_F[i]["count"]) : Convert.ToInt32(result_F[0]["count"]);

Mincount = Convert.ToInt32(result_F[i]["count"]) < Convert.ToInt32(result_F[0]["count"]) ? Convert.ToInt32(result_F[i]["count"]) : Convert.ToInt32(result_F[0]["count"]);
                        }
                        else
                        {
                            Maxcount = Maxcount > Convert.ToInt32(result_F[i]["count"]) ? Maxcount : Convert.ToInt32(result_F[i]["count"]);

Mincount = Mincount < Convert.ToInt32(result_F[i]["count"]) ? Mincount : Convert.ToInt32(result_F[i]["count"]);
                        }
                    }

double F_inteval = 0.0;
                    F_inteval = (Maxcount - Mincount) / 5;

//计算每个会员的F值
                    for (int i = 1; i < result_F.Count; i++)
                    {
                        string strUserid = result_F[i]["userId"].ToString();
                        int icount = Convert.ToInt32(result_F[i]["count"]);
                        string strUser_F = "0";

if (icount >= Mincount && icount <= F_inteval)
                        {
                            strUser_F = "1";
                        }
                        if (icount >= F_inteval && icount <= (F_inteval * 2))
                        {
                            strUser_F = "2";
                        }
                        if (icount >= (F_inteval * 2) && icount <= (F_inteval * 3))
                        {
                            strUser_F = "3";
                        }
                        if (icount >= (F_inteval * 3) && icount <= (F_inteval * 4))
                        {
                            strUser_F = "4";
                        }
                        if (icount >= (F_inteval * 4) && icount <= Maxcount)
                        {
                            strUser_F = "5";
                        }

//执行更新操作
                        var query_F = Query.EQ("user_Id", strUserid);
                        var update_F = new UpdateDocument { { "$set", new QueryDocument { { "user_F", strUser_F } } } };

colRFM.Update(query_F, update_F);
                    }
                }
            }
            catch (Exception ex)
            {
                throw;
            }

#endregion

#region 计算会员M值

try
            {

      //计算每组UserId中price(金额)的总和
                //var query_price = new QueryDocument{{"price",true}};
                //var update_price = new UpdateDocument{{"price",BsonType.Double}};
                //colRFM.Update(query_price, update_price);

Dictionary<string, double> dic_M = new Dictionary<string, double>();
                dic_M["msum"] = 0.0;
                var result_M = col.Group(query, groupbyBuilder, BsonDocument.Create(dic_M),
                                                BsonJavaScript.Create("function(obj,prev){prev.msum += obj.price;}"),
                                                BsonJavaScript.Create("function(obj){obj.sum=obj.msum;delete obj.sum;}")).ToList();

if (result_M.Count != 0)
                {
                    //计算出会员最大的消费金额和最小的消费金额
                    double Maxsum = 0.0;
                    double Minsum = 0.0;
                    for (int i = 1; i < result_M.Count; i++)
                    {
                        if (i == 1)
                        {
                            Maxsum = Convert.ToDouble(result_M[i]["msum"]) > Convert.ToDouble(result_M[0]["msum"]) ? Convert.ToDouble(result_M[i]["msum"]) : Convert.ToDouble(result_M[0]["msum"]);

Minsum = Convert.ToDouble(result_M[i]["msum"]) < Convert.ToDouble(result_M[0]["msum"]) ? Convert.ToDouble(result_M[i]["msum"]) : Convert.ToDouble(result_M[0]["msum"]);
                        }
                        else
                        {
                            Maxsum = Maxsum > Convert.ToDouble(result_M[i]["msum"]) ? Maxsum : Convert.ToDouble(result_M[i]["msum"]);

Minsum = Minsum < Convert.ToDouble(result_M[i]["msum"]) ? Minsum : Convert.ToDouble(result_M[i]["msum"]);
                        }
                    }

double M_interval = 0.0;
                    M_interval = (Maxsum - Minsum) / 5;

//计算每个会员的M值
                    for (int i = 0; i < result_M.Count; i++)
                    {
                        string strUserId = result_M[i]["userId"].ToString();
                        double dsum = Convert.ToDouble(result_M[i]["msum"]);

string struser_M = "0";
                        if (dsum >= Minsum && dsum <= M_interval)
                        {
                            struser_M = "1";
                        }
                        if (dsum >= M_interval && dsum <= (M_interval * 2))
                        {
                            struser_M = "2";
                        }
                        if (dsum >= (M_interval * 2) && dsum <= (M_interval * 3))
                        {
                            struser_M = "3";
                        }
                        if (dsum >= (M_interval * 3) && dsum <= (M_interval * 4))
                        {
                            struser_M = "4";
                        }
                        if (dsum >= (M_interval * 4) && dsum <= Maxsum)
                        {
                            struser_M = "5";
                        }

//执行更新操作
                        var query_M = Query.EQ("user_Id", strUserId);
                        var update_M = new UpdateDocument { { "$set", new QueryDocument { { "user_M", struser_M } } } };

colRFM.Update(query_M, update_M);
                    }
                }
            }
            catch (Exception ex)
            {
                throw;
            }

#endregion

}

C#代码 利用MongoDB中Group聚合函数查询的更多相关文章

  1. C#代码利用MongoDB中Group聚合函数查询

    例子: public static void getUserRFM(DateTime beginTime, DateTime endTime)        {            MongoDat ...

  2. 在MongoDB中实现聚合函数

    在MongoDB中实现聚合函数 随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加. ...

  3. 在MongoDB中实现聚合函数 (转)

    随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的 ...

  4. 浅析mongodb中group分组

    这篇文章主要介绍了浅析mongodb中group分组的实现方法及示例,非常的简单实用,有需要的小伙伴可以参考下. group做的聚合有些复杂.先选定分组所依据的键,此后MongoDB就会将集合依据选定 ...

  5. Mysql中使用聚合函数对null值的处理

    平时因为对于数据库研习的不深,所以在面试的时候问了一些平常遇到过的问题居然没法很肯定地回答出来,实在让自己很恼怒! 这次让我记忆深刻的一个问题是: 在mysql中使用聚合函数的时候比如avg(t),t ...

  6. MongoDB中的聚合操作

    根据MongoDB的文档描述,在MongoDB的聚合操作中,有以下五个聚合命令. 其中,count.distinct和group会提供很基本的功能,至于其他的高级聚合功能(sum.average.ma ...

  7. 75.Python中ORM聚合函数详解:Sum

    Sum:某个字段的总和. 1. 求图书的销售总额,示例代码如下: from django.http import HttpResponse from django.db import connecti ...

  8. 72.Python中ORM聚合函数详解:Avg,aggregate,annotate

    聚合函数: 如果你用原生SQL语句,则可以使用聚合函数提取数据.比如提取某个商品销售的数量,那么就可以使用Count,如果想要知道销售的平均价格,那么就可以使用Avg. 聚合函数是通过aggregat ...

  9. sqlserver中的聚合函数

    聚合函数:就是按照一定的规则将多行(Row)数据汇总成一行的函数,对数据进行汇总前,还可以按特定的列(coloumn)将数据进行分组(group by)再汇总,然后按照再次给定的条件进行筛选 一:Co ...

随机推荐

  1. michael的沟通秘籍

    1 多准备几个邮件模板2 lower expectation over delivery less promise extra give3 involve resource earliar 尽早接手公 ...

  2. Canu Parameter Reference(canu参数介绍)

    链接:Canu Parameter Reference To get the most up-to-date options, run canu -options The default values ...

  3. webdriver hangs when get or click

    Same times the webdriver hangs when get url or click some link,  webdriver executing (get or click) ...

  4. Selenium Grid 运行报错 Exception thrown in Navigator.Start first time ->Error forwarding the new session Empty pool of VM for setup Capabilities

    Selenium Grid 运行报错 : Exception thrown in Navigator.Start first time ->Error forwarding the new se ...

  5. 安卓App热补丁动态修复技术介绍

    版权声明:本文由johncz原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/169 来源:腾云阁 https://www.q ...

  6. JavaScript Table行定位效果

    作者:cloudgamer 时间: 2009-09-17 文档类型:原创 来自:蓝色理想 第 1 页 JavaScript Table行定位效果 [1] 第 2 页 JavaScript Table行 ...

  7. struts2 token 使用说明

    使用token标签的时候,Struts2会建立一个GUID(全局唯一的字符串)放在session中,并且会成为一个hidden放在form中. token拦截器会判断客户端form提交的token和s ...

  8. 封装jquery时用到的东西

    顺序都是瞎拍的,就是明显分割用 1.将函数封装成$(' ')这种形式 把函数名起成$ $(各种选择器) $(selector) 2.有时候jquery可以继续加点,返回自己本身的元素 创建个构造函数, ...

  9. robotframework笔记12

    使用测试库 测试库包含那些体现关键词,通常被称为 库关键字 实际上,这与系统交互 测试. 所有测试用例总是从一些库,使用关键字 通过高级 用户的关键字 . 本节解释如何 考虑测试库的使用和如何使用的关 ...

  10. 8个实用的页面布局和用户界面jQuery插件

    网页设计师和网页开发人员在做项目的时候可能会有一些页面的布局或者对于UI有一些特定的要求.可能一些需求不能单独使用CSS就能实现的.于是很多时候开发人员都会消耗大量的时间和精力去写一些JS来协助实现. ...