C#对mongodb的分组查询操作,主要通过脚本或Aggregate方法来实现,以下通过一些实例作解析:

参考资料:http://www.tuicool.com/articles/2iqUZj

       http://www.cnblogs.com/vnii/archive/2012/08/23/2652891.html

       http://www.cnblogs.com/zhwl/archive/2013/12/19/3482140.html

1. 根据任务id进行分组,统计每个任务的浏览数量。

  

        public static List<vm_quantityModel> GetMyIncomeDetail(int member_id, int pageIndex, int pageSize, out int totalCount)
{
//筛选条件
IMongoQuery query = Query.And(Query.EQ("member_id", member_id), Query.EQ("mark", )); MongoCollection<BsonDocument> myCollection = MongoDBHelper.GetCollection("mstg_record_history"); //分组
Dictionary<string, int> dic_initial = new Dictionary<string, int>();
dic_initial["num"] = ;
var r = myCollection.Group(
query,
"task_id", //分组的字段
BsonDocument.Create(dic_initial),
BsonJavaScript.Create("function(doc,prev){prev.num++;}"),
null
).ToList(); List<vm_quantityModel> result = new List<vm_quantityModel>();
if (r != null && r.Count > )
{
foreach (var item in r)
{
vm_quantityModel m = new vm_quantityModel();
m.task_id = Common.StringHelper.StrToInt(item["task_id"].ToString());
m.valid_count = Common.StringHelper.StrToLong(item["num"].ToString());
result.Add(m);
}
} totalCount = result.Count;
result = result.OrderByDescending(x => x.task_id).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList(); return result;
}

2.根据会员编号分组,累加价格的统计

        /// <summary>
/// 帮帮赚会员总收益
/// </summary>
/// <param name="memberIds"></param>
/// <returns></returns>
public static List<vm_rankingModel> GetBangZhuanList(List<int> memberIds)
{
var ids = memberIds.ConvertAll<BsonValue>(x => x);
//筛选字段
IMongoQuery query = Query.And(Query.In("member_id", ids), Query.EQ("mark", )); MongoCollection<BsonDocument> myCollection = MongoDBHelper.GetCollection("mstg_record_history"); //GroupBy的字段
GroupByBuilder groupbyBuilder = new GroupByBuilder(new string[] { "member_id" }); Dictionary<string, double> dic_M = new Dictionary<string, double>();
dic_M["msum"] = 0.0;
var result_M = myCollection.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(); List<vm_rankingModel> result = new List<vm_rankingModel>();
if (result_M != null && result_M.Count > )
{
foreach (var item in result_M)
{
double amount = Math.Round(Convert.ToDouble(item["msum"]), );
result.Add(new vm_rankingModel
{
member_id = Common.StringHelper.StrToInt(item["member_id"].ToString()),
amount = amount
});
}
} result = result.OrderByDescending(x => x.amount).ToList(); return result;
}

用Aggregate实现:

        public static List<vm_rankingModel> GetRankingList(int top)
{
MongoCollection<BsonDocument> myCollection = MongoDBHelper.GetCollection("mstg_record_history"); //分组获取金额总数
var group = new BsonDocument
{ { "$group",
new BsonDocument
{
{ "_id", new BsonDocument
{
{
"MemberId","$member_id"
}
}
},
{
"Count", new BsonDocument
{
{
"$sum", "$price"
}
}
}
}
}
};
//筛选条件
var match = new BsonDocument
{
{
"$match",
new BsonDocument
{
{"mark", }
}
}
}; var pipeline = new[] { match, group };
var list = myCollection.Aggregate(pipeline); var matchingExamples = list.ResultDocuments
.Select(x => x.ToDynamic())
.ToList();
List<vm_rankingModel> result = new List<vm_rankingModel>(); //foreach (var example in matchingExamples)
//{
// var message = string.Format("{0} - {1}", example._id.MyUser, example.Count);
// Console.WriteLine(message);
//} if (matchingExamples.Count > )
{
foreach (var example in matchingExamples)
{
int member_id = Convert.ToInt32(example._id.MemberId.Value);
double amount = Math.Round(example.Count.Value, );
result.Add(new vm_rankingModel
{
member_id = member_id,
amount = amount
});
}
} result = result.OrderByDescending(x => x.amount).Take(top).ToList(); return result;
}

3. 按日期分组,累加价格的统计

        public static List<vm_bangzhuan_detailModel> GetBangZhuanDetails(List<int> memberIds)
{
var ids = memberIds.ConvertAll<BsonValue>(x => x);
//有效浏览数
IMongoQuery query = Query.And(Query.In("member_id", ids), Query.EQ("mark", )); MongoCollection<BsonDocument> myCollection = MongoDBHelper.GetCollection("mstg_record_history"); Dictionary<string, double> dic_M = new Dictionary<string, double>();
dic_M["msum"] = 0.0;
var result_M = myCollection.Group(query, BsonJavaScript.Create("function(doc){ var date = new Date(doc.add_time); var dateKey = date.getFullYear()+'年'+(date.getMonth()+1)+'月'+date.getDate(); return {'day':dateKey}; }"), 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(); List<vm_bangzhuan_detailModel> result = new List<vm_bangzhuan_detailModel>();
if (result_M != null && result_M.Count > )
{
foreach (var item in result_M)
{
double amount = Math.Round(Convert.ToDouble(item["msum"]), );
result.Add(new vm_bangzhuan_detailModel
{
day = Convert.ToDateTime(item["day"]),
amount = amount
});
}
} result = result.OrderByDescending(x => x.day).ToList(); return result;
}

MongoDB 的分组操作 In C#的更多相关文章

  1. Java对MongoDB进行分组操作并统计各个分组的数量

    最近在检索MongoDB的数据时需要用到分组操作,由于没有现成的说明文档可参考,只能是在代码中不断调试.摸索前进:目前已现实了Java对MongoDB的分组操作,并统计各个分组的数量.现通过示例详细解 ...

  2. mongoDB进行分组操作

    一.$group 进行分组 1.每个职位的雇员人数: db.getCollection('emp').aggregate( [ {'$group':{ ‘_id’:'$job', job_count: ...

  3. springboot 学习之路 14(整合mongodb的Api操作)

    springboot整合mongodb: mongodb的安装和权限配置  请点击连接参考 mongodb集成 : 第一步:引如pom文件 第二步:配置文件配置mongodb路径: 第三步:关于mon ...

  4. MongoDB的聚合操作以及与Python的交互

    上一篇主要介绍了MongoDB的基本操作,包括创建.插入.保存.更新和查询等,链接为MongoDB基本操作. 在本文中主要介绍MongoDB的聚合以及与Python的交互. MongoDB聚合 什么是 ...

  5. mongodb group php 操作

    紧接着上篇来,这篇主要讲,mongodb的group功能,做的还是挺强大的,相当对于find(),skip(),distinct()等,用法比较复杂. 测试数据 > db.fruit.find( ...

  6. MongoDB 的聚集操作

    聚合引言 聚集操作就是出来数据记录并返回计算结果的操作.MongoDB提供了丰富的聚集操作.可以检測和执行数据集上的计算.执行在mongod上的数据聚集简化了代码和资源限制. 像查询一样,在Mongo ...

  7. mongodb的聚合操作

    在mongodb中有时候我们需要对数据进行分析操作,比如一些统计操作,这个时候简单的查询操作(find)就搞不定这些需求,因此就需要使用  聚合框架(aggregation) 来完成.在mongodb ...

  8. 【翻译】MongoDB指南/CRUD操作(二)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...

  9. 【翻译】MongoDB指南/CRUD操作(一)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删 ...

随机推荐

  1. Android应用正确使用扩展SD卡,特别是安卓4.4以后的版本

    Android 开发时如何正确获取使用扩展存储路径 在 2.x 版本中,Android设备都是单存储,第三方App写文件,必须申请 WRITE_EXTERNAL_STORAGE 权限: 在4.0之后, ...

  2. Java网络编程(TCP服务端)

    /* * TCP服务端: * 1.创建服务端socket服务,并监听一个端口 * 2.服务端为了给客户端提供服务,获取客户端的内容,可以通过accept方法获取连接过来的客户端对象 * 3.可以通过获 ...

  3. ACCESS-字符函数

    mid:等于delphi中的COPY举例str="123456"mid(str,2,1)的意思是在str字符串中从第2个字符开始取得一个字符,结果为2注意:下标是从1开始,而不是从 ...

  4. openstack系列阅读目录

    一 keystone系列 keystone基础 网关协议cgi,fastcgi,wsgi,uwsgi keystone源码分析 keystone部署及使用 keystone客户端工作介绍 二 glan ...

  5. java学习之路---线程(重点)

     1.多线程是一种并发机制的有效手段.进程和线程一样,都是实现并发的一个基本单位.线程是比进程更小的一种实现单位,线程是在进程的基础上的进一步划分.所谓的多线就是在一个进程中产生了多个线程,这些线程可 ...

  6. 搭架私有Git服务器Gogs

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:搭架私有Git服务器Gogs.

  7. ZZTHX-Androidannotations框架联想

    我们首先来看一段代码: 在android开发中findViewById是最常用的一个方法,用来实例化页面上的控件,基本上每个控件都需要调用一次的,加入我们页面上有100个需要使用,那么findView ...

  8. SPOJ - OTOCI LCT

    OTOCI Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/problem/viewProblem. ...

  9. 开源企业IM,免费企业即时通讯软件-ENTBOOST云通讯平台Windows(r174)版本号公布

    经过恩布团队全体成员的不懈努力,依照原定计划,最终在今天(5月14日)公布第二个开源版本号,恩布企业互联IM,ENTBOOST 0.2.0(r174beta)Windows版本号:主要功能支持文本.表 ...

  10. [AngularJS] Accessible Button Events

    Often buttons need to be handled by JavaScript, and if done improperly it can lead to accessibility ...