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操作包括创建.读取.更新和删 ...
随机推荐
- weiphp3.0(thinkphp)的调整之路
weiphp是在thinkphp的基础上开发的简洁强大开源的微信公众平台开发框架,其宣称微信功能插件化开发,多公众号管理,配置简单. 但是关于weiphp的文档使用一是内容真不多,二是写的也不详细. ...
- 扯扯淡,写个更快的memcpy
写代码有时候和笃信宗教一样,一旦信仰崩溃,是最难受的事情.早年我读过云风的一篇<VC 对 memcpy 的优化>,以及<Efficiency geek 2: copying data ...
- poj1741-Tree(树的分治)
题意:给一棵树,求树上长度小于等于k的链的数量. 题解:http://blog.csdn.net/yang_7_46/article/details/9966455 照着这个博客写的代码. 不到100 ...
- Memcached使用笔记
1.linux启动memcached命令 进入到memcached安装目录,可以用whereis memcached查看,默认安装在/usr/bin/目录下 输入以下命令,下面两行任选一行就可以了 m ...
- 关于PCB布线的顺序到底是怎样才合理?
有人说先布好电源线和地线,让它们尽量靠近走,然后再考虑信号线:也有人说先布好关键的信号线,然后再走电源和地线:还有人说先布好电源线,再布信号线,地线最后布.到底怎么样才算好呢?或者说,一般应按照什么顺 ...
- 射频识别技术漫谈(15)——Mifare1的安全性及7字节序列号M1卡【worlsing笔记】
Mifare1的安全性主要指卡中数据的安全性,要求卡中的数据不能被非法修改或窃听.数据的安全性主要使用加密技术来保证,加密技术有两个关键因素:加密算法和密钥.现代加密技术的一大特点是加密算法公开,如果 ...
- jquery如何自定义插件(扩展实例/静态方法)
1.jquery插件的种类: 1).封装对象方法的插件(相当于实例方法) (使用 $.fn.extend({"方法名":function(参数){//方法体} }) ) 2).封装 ...
- ECSHOP在线手册布局参考图--积分商城 exchange_list.dwt
A.购物车 1,设置方法 程序自动读取购物车的商品数量 2,代码相关 cart.lbi 中 {insert_scripts files='transport.js'} <div clas ...
- android实现弧形进度表盘效果
附件:Cirbar.rar
- android128 zhihuibeijing 科大讯飞 语音识别
- 科大讯飞 开放平台 http://open.voicecloud.cn/ package com.itheima.voicedemo; import android.app.Activity; i ...