zoukankan      html  css  js  c++  java
  • MongoDB.Driver 管道 Aggregate

    目前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管道操作符处理后,前五个文档被"过滤"掉。

  • 相关阅读:
    重构的体会——类属性优先移动
    jQuery实现无限循环滚动公告
    jquery菜单左右翻屏效果
    44种IE css bug实例测试总结
    IE6不支持position:fixed的解决方法
    DedeCMS会员排行调用代码,实现连接到会员空间
    程序员们 不要想一辈子靠技术混饭吃
    Load JSON data with jQuery, PHP and MySQL
    mysql 实现行号的方法——如何获取当前记录所在行号
    jQuery精仿手机上的翻牌效果菜单
  • 原文地址:https://www.cnblogs.com/asd14828/p/10342412.html
Copyright © 2011-2022 走看看