MongoDB——Aggregates(c#实现支持数组字段)
来源:互联网 发布:天涯与知乎 编辑:程序博客网 时间:2024/05/29 02:32
c#实现
添加如下引用:本文引用版本为:Version=2.2.4.26
using MongoDB.Bson;
using MongoDB.Driver;
构建聚合管道:要求能够
- 返回指定条数记录
- 针对过滤结果聚合
- 支持非数组字段
- 支持数组字段数据拆分
构建代码如下:
/// 构建聚合管道 /// </summary> /// <param name="filterJson">过滤条件</param> /// <param name="limit">限制返回条数</param> /// <param name="field">聚合字段名称</param> /// <param name="isArray"></param> /// <returns></returns> public PipelineDefinition<BsonDocument, BsonDocument> GetPipeLine(string filterJson, int limit, string field, bool isArray = true) { string pipeline3 = string.Format(" {{$group: {{_id:'${0}', count: {{$sum: 1}}}}}}", field); string pipeline4 = string.Format(" {{$limit: {0}}}", limit); var pipelines = new List<string> { pipeline3, pipeline4 }; if (!string.IsNullOrEmpty(filterJson)) { var pipeline2 = string.Format(" {{$match:{0}}}", filterJson); pipelines.Insert(0, pipeline2); } if (isArray) { var pipeline1 = string.Format(" {{$unwind:'${0}'}}", field); pipelines.Insert(0, pipeline1); }
根据构建管道执行聚合:
/// <summary> /// 获得聚合结果 /// </summary> /// <param name="pipeline"></param> /// <returns></returns> public async Task<List<BsonDocument>> GetAggregate(PipelineDefinition<BsonDocument, BsonDocument> pipeline) { var aggs = await GetCollection().AggregateAsync(pipeline); return await aggs.ToListAsync(); }
返回的是文档列表
以上是两个基础方法,依据不同业务需求可以进行组合调用
业务需求:
支持对多字段进行聚合,统一返回所有的聚合结果
每个字段的聚合结果为聚合内容和总记录个数
首先返回单个字段聚合结果:
/// <summary> /// 获得单个字段的聚合结果 /// </summary> /// <param name="filterJson"></param> /// <param name="limit"></param> /// <param name="field"></param> /// <returns></returns> public async Task<Dictionary<string, int>> GetAggs(string filterJson, int limit, string field) { var access = new MongoAccessAuto(); var pipeline = access.GetPipeLine(filterJson, limit, field); List<BsonDocument> aggs; try { aggs = await access.GetAggregate(pipeline); } catch (Exception) { pipeline = access.GetPipeLine(filterJson, limit, field, false); aggs = await access.GetAggregate(pipeline); } //转化返回聚合形式 var groups = aggs.ConvertAll(s => s.ToDictionary()); var tokens = new Dictionary<string, int>(); foreach (var group in groups) { var id = @group["_id"]?.ToString() ?? "null"; var records = Convert.ToInt32(group["count"].ToString()); tokens.Add(id, records); } return tokens; }
以上将聚合结果存储在字典当中,并且支持对数组字段数据的拆分,使得数组字段内容被拆分为多条进行聚合统计
逻辑调用获得业务需求结果:
//获得聚合结果 var gc = new GroupCollection(); if (groupCondition?.GFields != null) { foreach (var field in groupCondition.GFields) { var tokens = await Provider.GetAggs(filterCondition?.ToString(), groupCondition.Top, field); gc.Add(field, tokens); } response.Groups = gc; }
其中最终存放聚合结果的形式为
public class GroupCollection : Dictionary<string, Dictionary<string, int>> { }
得到的结果展示为:
"groups": { "s:datasourcename": { "cnki": 30, "互联网g页资源": 3, "图形库": 8 }, "s:format": { "gif": 4, "bmp": 4, "tif": 5, "jpg": 5, "xlsx": 4, "pdf": 4, "doc": 5, "html": 3, "png": 4, "dataset": 3 }, "s:media": { "null": 3, "数字存储": 38 }, "ep:o:organization": { "中国矿物岩石地球": 2, "中国地质大学(北京)": 9, "中海研究中心": 4, "中国科学院洋研究所": 1, "长江学": 9, "中国科研究所": 1, "中国地大学(武汉)": 2, "成都理学": 2, "石油社": 3, "中化石发有限公司": 8 }, "b:contributor": { "冉江": 1, "陈民": 1, "王菊": 3, "吴娟": 1, "李峰": 1, "耿威": 2, "xiaofeng": 8, "施生": 3, "于维": 9, "崔叶": 4 } }
0 0
- MongoDB——Aggregates(c#实现支持数组字段)
- MongoDB——Aggregates聚合
- MongoDB——更新操作(Update)c#实现
- mongodb将元素添加进数组字段
- C#实现Mongodb开发
- C#类成员—字段
- java实现mongodb中自增长字段
- Scaling your cloud——详解 Nova 中的 Region, Cell, Availability Zone, Host Aggregates Zone
- Scaling your cloud——详解 Nova 中的 Region, Cell, Availability Zone, Host Aggregates Zone
- c# 关键字const(字段,局部变量),readonly(字段,数组)
- MongoDB:16-MongoDB-索引数组字段和索引子文档字段
- 强大的mongoDB——自定义的字段
- Openstack 用Host aggregates实现灵活的调度策略
- C#中的只读字段——readonly
- c# 基础知识——属性、字段
- C#实现控件数组
- C#实现控件数组
- mongodb基础系列——java操作mongodb实现CURD
- 证书介绍及openssl生成证书和吊销列表
- php GD库画图 验证码
- 一篇很全面的freemarker教程
- Scrapy定向爬虫教程(四)——数据存入MongoDB
- 分治法求最小点对距离
- MongoDB——Aggregates(c#实现支持数组字段)
- ffmpeg.c函数结构简单分析(画图)
- GC roots
- 配置apt源
- 网络编程(17)—— 使用recv检查输入缓存是否有数据
- 跨平台Caffe及I/O模型与并行方案(三)
- HTML练习css--制作开心餐厅介绍页面
- TankWar 单机(JAVA版)版本2.2 超级炮弹
- 手机数据库增删改查操作