MongoDB 的分组操作 In C#
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#的更多相关文章
- Java对MongoDB进行分组操作并统计各个分组的数量
最近在检索MongoDB的数据时需要用到分组操作,由于没有现成的说明文档可参考,只能是在代码中不断调试.摸索前进:目前已现实了Java对MongoDB的分组操作,并统计各个分组的数量.现通过示例详细解 ...
- mongoDB进行分组操作
一.$group 进行分组 1.每个职位的雇员人数: db.getCollection('emp').aggregate( [ {'$group':{ ‘_id’:'$job', job_count: ...
- springboot 学习之路 14(整合mongodb的Api操作)
springboot整合mongodb: mongodb的安装和权限配置 请点击连接参考 mongodb集成 : 第一步:引如pom文件 第二步:配置文件配置mongodb路径: 第三步:关于mon ...
- MongoDB的聚合操作以及与Python的交互
上一篇主要介绍了MongoDB的基本操作,包括创建.插入.保存.更新和查询等,链接为MongoDB基本操作. 在本文中主要介绍MongoDB的聚合以及与Python的交互. MongoDB聚合 什么是 ...
- mongodb group php 操作
紧接着上篇来,这篇主要讲,mongodb的group功能,做的还是挺强大的,相当对于find(),skip(),distinct()等,用法比较复杂. 测试数据 > db.fruit.find( ...
- MongoDB 的聚集操作
聚合引言 聚集操作就是出来数据记录并返回计算结果的操作.MongoDB提供了丰富的聚集操作.可以检測和执行数据集上的计算.执行在mongod上的数据聚集简化了代码和资源限制. 像查询一样,在Mongo ...
- mongodb的聚合操作
在mongodb中有时候我们需要对数据进行分析操作,比如一些统计操作,这个时候简单的查询操作(find)就搞不定这些需求,因此就需要使用 聚合框架(aggregation) 来完成.在mongodb ...
- 【翻译】MongoDB指南/CRUD操作(二)
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...
- 【翻译】MongoDB指南/CRUD操作(一)
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删 ...
随机推荐
- Android应用正确使用扩展SD卡,特别是安卓4.4以后的版本
Android 开发时如何正确获取使用扩展存储路径 在 2.x 版本中,Android设备都是单存储,第三方App写文件,必须申请 WRITE_EXTERNAL_STORAGE 权限: 在4.0之后, ...
- Java网络编程(TCP服务端)
/* * TCP服务端: * 1.创建服务端socket服务,并监听一个端口 * 2.服务端为了给客户端提供服务,获取客户端的内容,可以通过accept方法获取连接过来的客户端对象 * 3.可以通过获 ...
- ACCESS-字符函数
mid:等于delphi中的COPY举例str="123456"mid(str,2,1)的意思是在str字符串中从第2个字符开始取得一个字符,结果为2注意:下标是从1开始,而不是从 ...
- openstack系列阅读目录
一 keystone系列 keystone基础 网关协议cgi,fastcgi,wsgi,uwsgi keystone源码分析 keystone部署及使用 keystone客户端工作介绍 二 glan ...
- java学习之路---线程(重点)
1.多线程是一种并发机制的有效手段.进程和线程一样,都是实现并发的一个基本单位.线程是比进程更小的一种实现单位,线程是在进程的基础上的进一步划分.所谓的多线就是在一个进程中产生了多个线程,这些线程可 ...
- 搭架私有Git服务器Gogs
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:搭架私有Git服务器Gogs.
- ZZTHX-Androidannotations框架联想
我们首先来看一段代码: 在android开发中findViewById是最常用的一个方法,用来实例化页面上的控件,基本上每个控件都需要调用一次的,加入我们页面上有100个需要使用,那么findView ...
- SPOJ - OTOCI LCT
OTOCI Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/problem/viewProblem. ...
- 开源企业IM,免费企业即时通讯软件-ENTBOOST云通讯平台Windows(r174)版本号公布
经过恩布团队全体成员的不懈努力,依照原定计划,最终在今天(5月14日)公布第二个开源版本号,恩布企业互联IM,ENTBOOST 0.2.0(r174beta)Windows版本号:主要功能支持文本.表 ...
- [AngularJS] Accessible Button Events
Often buttons need to be handled by JavaScript, and if done improperly it can lead to accessibility ...