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操作包括创建.读取.更新和删 ...
随机推荐
- POJ3922 A simple stone game
网上有很多解题报告,我的理解就是可以用类似数学归纳的方法证明,就是取一个数,让对手进入必败态. 详细见论文.
- Java中finalize方法用途何在?
package thinking.in.java.demo; /* * finalize的用途何在? * *本例的终止条件是L所有的Book对象在被当做垃圾回收前都应该被签入.但是在main方法中 * ...
- JavaAPI之Runtime类以及bat文件开启应用程序
package OtherToolsClass; import java.io.IOException; public class RuntimeDemo { /** * @param args */ ...
- Android Design 与 Holo Theme
转载:http://www.geekpark.net/topics/179488 [核心提示] 提到 Android Design,很多人会做出”啊,知道,就是黑色的背景和灰蓝色的平的按钮嘛”,那么到 ...
- 使用Java原生代理实现数据注入
本文由博主原创,转载请注明出处 完整源码下载地址 https://github.com/MatrixSeven/JavaAOP 上一篇,咱们说了使用Java原生代理实现AOP的简单例子,然么就不得不说 ...
- 【C++深入浅出】设计模式学习之单例模式
但凡成为大家公认的模式,都是有一些不可小觑的威力,今天分享一个简单的设计模式:单例模式. 单例模式用于一些只希望有一个实例的类或者只希望执行一次的操作:校长只能有一个.老板只能有一个.用户点击弹窗只希 ...
- C#.NET数据库访问类DBHelper
这是一个与C# .NET通用的数据库访问类,包含了工厂模式.事务处理等安全机制. 调用方式: DBHelper db = new DBHelper(); DbCommand cmd = db.GetS ...
- SQL Server 2005 盛宴系列 经典教程
SQL Server 2005 盛宴系列 经典教程 [复制链接] 发表于 2007-3-27 14:08 | 来自 51CTO网页 [只看他] 楼主 TECHNET SQL serve ...
- 解决SenTestingKit/SenTestingKit.h: No such file or directory
在一个iOS项目中引入了单元测试,感觉项目间的依赖关系有些乱,就建了一个新的Project,再把原来的.h和.m加进去,编译时竟然出现“SenTestingKit/SenTestingKit.h: N ...
- AD新建用户、组、OU
#新建用户 import-csv d:\AD\Users.csv | Foreach {New-ADUser -Name $_.Name -Path $_.Path -samAccountName $ ...