上一篇文章,写了mongodb常规操作,继续写入,本章主要讲高级查询,文本,聚集,大数据查询。

Mongodb的查询语法是很多的,是NOSQL队伍中比较丰富的一个。当然有很多查询跟关系型查询无法相比。例如联表查询,Mongodb并不擅长联表查询,虽然出一个$lookup支持两个集合之间关联,不过跟关系相比之就逊色多了。

Mongodb的查询种类很丰富,这里就不一一讲解,挑一些常用的写出来,作一个笔记。

一  聚合查询

mongodb对数据统计,筛选引用aggregate()进行聚合查询。功能相当强大。

常用几个操作符

$project:修改文档的结构(重命名、增加或删除域),也可以用于创建计算结果以及嵌套文档。

$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。

$match:过滤数据,只输出符合条件的文档。

$limit:限制MongoDB聚合管道返回的文档数。

$skip:在聚合管道中跳过指定数量的文档。

$group:将集合中的文档分组,可用于统计结果。

$sort:文档排序输出。

$sum 计算总和

以上这几个操作符,是最常用的,mongodb中必须要掌握的操作符。下面一个,一个用net core示例讲解,将依然使用这个 系列第一篇数据结构,有不了解的同学可以去看一看第一篇。

我们先尝试添加一些模拟数据,以方便程序测试。

class Program
{
    static void Main(string[] args)
    {
        MongoClient client = new MongoClient("mongodb://192.168.99.5");
        IMongoDatabase dbBase = client.GetDatabase("School");
        IMongoCollection<Class> collection = dbBase.GetCollection<Class>("Class");

        //生成随机数使用
        Random random = new Random();
        var nameItems1 = "赵、钱、孙、李、周、吴、郑、王、冯、陈、楮、卫、蒋、沈、韩、杨、朱、秦、尤、许、何".Split("、").ToList();
        var nameItems2 = "盼丽、艳红、甜甜、璨、彬彬、银红、晨曦、婷、广荣、蓓、小艳、欣如、辅仁、嘉、雯婷".Split("、").ToList();

        ; i < ; i++)
        {
            collection.InsertOne(new Class
            {
                ClassName = $"{i}年级",
                StudentItems = ((Func<List<Student>>)(() =>
                {
                    var studentItems = new List<Student>();
                    , );
                    ; t < studentCount; t++)
                    {
                        studentItems.Add(new Student
                        {
                            Age = random.Next(, ),
                            Name = nameItems1[random.Next(, nameItems1.Count)] + nameItems2[random.Next(, nameItems2.Count)],
                            Sex = random.Next(, ) ==  ? "男" : "女"
                        });
                    }
                    return studentItems;
                }))()
            });
        }
    }
}

public class Class
{
    public BsonObjectId Id { set; get; }

    public string ClassName { set; get; }

    public List<Student> StudentItems { set; get; }
}

public class Student
{
    public string Name { set; get; }

    public int Age { set; get; }

    public string Sex { set; get; }
}

collection.Aggregate<>
//是一个泛型方法,返回类型可以是BsonDocument或实体,自动序列化。
//例如
collection.Aggregate<BsonDocument>()
collection.Aggregate<实体类>()
//值得一提的是Aggregate()接受的参数是PipelineDefinition,而PipelineDefinition类中使用implicit 类型转换运算符。所以直接输入参数即可

$project 操作符

var items = collection.Aggregate<BsonDocument>(new[] {
    ) } }
}).ToList();

结果:你会发现StudentItems 被单独提取出来

$unwind 操作符

var items = collection.Aggregate<BsonDocument>(new[] {
    new BsonDocument ("$unwind","$StudentItems")
}).ToList();

结果:你会发现StudentItems 的每一项都抽出来与原来的文档组成一个新的文档

一般情况,$project和$unwind组合使用。比如提取出StudentItems 每一项组成一个文档。例如

var items = collection.Aggregate<BsonDocument>(new[] {
    ) } },
    new BsonDocument ("$unwind","$StudentItems")
}).ToList();

结果:

$match 操作符

var items = collection.Aggregate<BsonDocument>(new[] {
    new BsonDocument { { "$match", new BsonDocument("ClassName", "1年级") } }
}).ToList();

结果:

$limit 操作符

$skip 操作符

var items = collection.Aggregate<BsonDocument>(new[] {
    ),
    )
}).ToList();

结果:跳过前两条之后,选择前三条。例如:组合于分页的应用

$group 操作符

$sum 操作符

var items = collection.Aggregate<BsonDocument>(new[] {
    new BsonDocument {
        { "$group", new BsonDocument {
            { "_id", new BsonDocument("ClassName","$ClassName")},
            { ) }}
        }
     }
}).ToList();

结果:按年级分组,并且统计每组总行数

$sort 操作符

var items = collection.Aggregate<BsonDocument>(new[] {
    new BsonDocument {
        { )}}
}).ToList();

注意:操作符顺序很重要,先后顺序不同,会导致结果不一样。

mongodb聚合查询,笔记到这里。

Mongodb高级查询【二】的更多相关文章

  1. mongoDB高级查询$type4array使用解析

    今天在使用mongoDB高级查询$type:符号 -- 4代指Array类型发现一个问题. $type符号: $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. 下面是mong ...

  2. mongoDB 高级查询语法

    http://www.cnblogs.com/ITAres/articles/2084794.html本文参考自官方的手册:http://www.mongodb.org/display/DOCS/Ad ...

  3. MongoDB高级查询用法大全

    转载 http://blog.163.com/lgh_2002/blog/static/440175262012052116455/ 详见官方的手册: http://www.mongodb.org/d ...

  4. MongoDB高级查询详细

    前言 前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客  MongoDB下载安装与简单增删改查 前 ...

  5. mongodb高级查询

    前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客  MongoDB下载安装与简单增删改查 前奏:启 ...

  6. MongoDB中的高级查询(二)

    $mod取模运算 查询index对5取模运算等于1的数据. $not $not是元条件句,即可以用在任何其他条件之上.查询index对5取模运算不等于1的数据. $exists判断字段是否存在 查询出 ...

  7. accp8.0转换教材第4章MySQL高级查询(二)理解与练习

    知识点:EXISTS子查询.NOT EXISTS子查询.分页查询.UNION联合查询 一.单词部分 ①exist存在②temp临时的③district区域 ④content内容⑤temporary暂时 ...

  8. MongoDB 高级查询_aggregate聚合管道

    MongoDB 聚合管道(AggregationPipeline) 使用聚合管道可以对集合中的文档进行变换和组合.实际项目应用主要是表关联查询.数据的统计. MongoDB 中使用 db.COLLEC ...

  9. 2015.4.10-SQL 高级查询(二)

    1.TOP字句: 用于规定要返回的记录的数目 select top number(个数)/percent(百分数)  列名  from 表名  2.like模糊查询,用于where字句中,以及通配符 ...

随机推荐

  1. MongoDB学习笔记&lt;一&gt;

    今天学习了shell的主要的操作,例如以下: 1.创建一个数据库foobar use foobar 2.给指定的数据库加入集合,并加入记录 db.person.insert({"name&q ...

  2. UVA - 11396 Claw Decomposition(二分图染色)

    题目大意:给你一张无向图,每一个点的度数都是3. 你的任务是推断是否能把它分解成若干个爪(每条边仅仅能属于一个爪) 解题思路:二分图染色裸题.能够得出:爪的中心点和旁边的三个点的颜色是不一样的 #in ...

  3. Scala环境搭建之eclipse

    由于Spark的缘故.我们来看看另外一门语言--Scala,为什么要看这门语言呢?唉~事实上你不看也没关系,仅仅只是spark的内核就是用Scala写的.spark也提供其它语言的编程模型....看自 ...

  4. gulp的基本用法

    这几天简单的研究了一下gulp的用法,gulp对于初学者来说还是很友好的. 官方给出gulp的优点如下: 1.通过代码优于配置的策略,Gulp 让简单的任务简单,复杂的任务可管理. 2.Gulp 严格 ...

  5. dataTables 使用整理

    官方网站:http://www.datatables.net/ 简介:DataTables是一个jQuery的表格插件.这是一个高度灵活的工具,依据的基础逐步增强,这将增加先进的互动控制,支持任何HT ...

  6. 常见.NET功能代码汇总 (3)

    33,彻底关闭Excel进程 .NET中使用Excel属于使用非托管资源,使用完成后一般都要用GC回收资源,但是,调用GC的位置不正确,Excel进程可能无法彻底关闭,如下面的代码: static v ...

  7. Android查缺补漏(View篇)--自定义 View 的基本流程

    View是Android很重要的一部分,常用的View有Button.TextView.EditView.ListView.GridView.各种layout等等,开发者通过对这些View的各种组合以 ...

  8. C++ 头文件系列(stdexcept)

    预定义异常类 这个头文件包含的内容非常简单,只包含9个异常类,均从exception类派生,因此我们用三张图来描述: 这里仅解释两点: overflow : 指值的大小超过 整型 变量能表示的范围,即 ...

  9. CPU31X-2DP通过DP网络连接远程IO站

    一.远程IO站介绍 二.该DP网络系统结构 三.组态DP主站 1.组态机架硬件配置 2.设置profibus属性,主站地址为2,如下图 3.完成主站组态 四.组态远程IO从站ET200M 1.接口模块 ...

  10. ArcGIS API for JavaScript 4.2学习笔记[16] 弹窗自定义功能按钮及为要素自定义按钮(第五章完结)

    这节对Popups这一章的最后两个例子进行介绍和解析. 第一个[Popup Actions]介绍了弹窗中如何自定义工具按钮(名为actions),以PopupTemplate+FeatureLayer ...