MongoDB.Driver 管道 Aggregate
2024-08-31 22:21:59
目前mongodb for C#这个驱动,在进行Aggregate时,只支持BsonDocument类型,也就是说,你的集合collection也必须返回的是BsonDocument,而实体类型是不可以被认出的,这点要注意.
public IAsyncCursor<BsonDocument> GetAggregate(MongodbHost host,PipelineDefinition<BsonDocument, BsonDocument> pipeline)
{
MongoClient client = new MongoClient(host.Connection);
var dataBase = client.GetDatabase(host.DataBase);
var dataTb=dataBase.GetCollection<BsonDocument>(host.Table);
return dataTb.Aggregate(pipeline);
}
public class MongodbHost
{
/// <summary>
/// 连接字符串
/// </summary>
public string Connection { get; set; }
/// <summary>
/// 库
/// </summary>
public string DataBase { get; set; }
/// <summary>
/// 表
/// </summary>
public string Table { get; set; } }
MongodbHost mongodbHost = new MongodbHost();
mongodbHost.Connection = "mongodb://test1:test1@127.0.0.1:27017/mytest";
mongodbHost.DataBase = "mytest";
mongodbHost.Table = "testtb1"; const string pipelineJson1 = "{$group:{_id:'$Symbol',Value:{$max:'$Value'}}}";//" {$project : {DTime : 1 ,AdvInf : 1}}";
const string pipelineJson2 = " { $match : { AdvInf : { $eq :3 } } }";
const string pipelineJson3 = " { $match : { DTime : { $gte :ISODate('2018-12-04T02:20:12') } } }"; IList<IPipelineStageDefinition> stages = new List<IPipelineStageDefinition>();
PipelineStageDefinition<BsonDocument, BsonDocument> stage1 =
new JsonPipelineStageDefinition<BsonDocument, BsonDocument>(pipelineJson1);
PipelineStageDefinition<BsonDocument, BsonDocument> stage2 =
new JsonPipelineStageDefinition<BsonDocument, BsonDocument>(pipelineJson2);
PipelineStageDefinition<BsonDocument, BsonDocument> stage3 =
new JsonPipelineStageDefinition<BsonDocument, BsonDocument>(pipelineJson3); stages.Add(stage1);
//stages.Add(stage2);
//stages.Add(stage3); PipelineDefinition<BsonDocument, BsonDocument> pipeline = new PipelineStagePipelineDefinition<BsonDocument, BsonDocument>(stages); var gdValue = GetAggregate(mongodbHost,pipeline);
管道的概念
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
这里我们介绍一下聚合框架中常用的几个操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
管道操作符实例
1、$project实例
db.article.aggregate(
{ $project : {
title : 1 ,
author : 1 ,
}}
);
这样的话结果中就只还有_id,tilte和author三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以这样:
db.article.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
author : 1
}});
2.$match实例
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
$match用于获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。
3.$skip实例
db.article.aggregate(
{ $skip : 5 });
经过$skip管道操作符处理后,前五个文档被"过滤"掉。
最新文章
- CCNET+MSBuild+SVN实现每日构建
- Samba Server 配置
- 七牛:关于图片 EXIF 信息中旋转参数 Orientation 的理解
- object_id的用法
- UIButton的状态
- mysql博客
- C# 调试程序弹出 没有可用于当前位置的源代码 对话框
- andriod手机签到应用服务器架构
- easyui帮助文档地址
- Go语言学习1
- Winows + VSCode + Debug PHP
- windows服务器nginx+php启动开源ecshop
- HihoCoder - 1807:好的数字串 (KMP DP)
- Windows 下使用 GCC
- angularjs之事件绑定、解除事件绑定
- Js 问题分析--js 影响页面性能
- js停止(阻止)浏览器继续加载内容
- Hbase 学习笔记5----hbase region, store, storefile和列簇的关系
- day5-xml模块
- TOM的show_space
热门文章
- BZOJ 2021 Usaco2010 Jan Cheese Towers 动态规划
- hadoop 3.x 单机集群配置/启动时的问题处理
- expdp备份速度慢的问题
- 轻松掌握XMLHttpRequest对象
- tcl/tk 调用选择路径的窗口
- HTTP协议(一些报头字段的作用,如cace-control、keep-alive)
- Matlab Tricks(十七)—— 使用 Latex
- silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发)
- Python 辨异 —— __init__ 与 __new__
- sigsuspend sigprocmask函数的用法