转载地址:https://www.cnblogs.com/NET-BLOG/p/8252166.html

上一篇文章,写了 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();for (var i = 1; i < 7; i++){collection.InsertOne(new Class{ClassName = $"{i}年级",StudentItems = ((Func<List<Student>>)(() =>{var studentItems = new List<Student>();var studentCount = random.Next(5, 15);for (var t = 0; t < studentCount; t++){studentItems.Add(new Student{Age = random.Next(6, 12),Name = nameItems1[random.Next(0, nameItems1.Count)] + nameItems2[random.Next(0, nameItems2.Count)],Sex = random.Next(1, 3) == 1 ? "男" : "女"});}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[] {new BsonDocument { { "$project", new BsonDocument("StudentItems", 1) } }
}).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 { { "$project", new BsonDocument("StudentItems", 1) } },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[] {new BsonDocument("$skip",2),new BsonDocument("$limit",3)
}).ToList();

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

$group 操作符

$sum 操作符

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

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

$sort 操作符

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

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

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

Mongodb高级查询【二】相关推荐

  1. MongoDB高级查询介绍

    title: MongoDB高级查询介绍 date: 2017-12-3 22:14:19 tags: MongoDB MongoDB查询 categories: 数据库 在几乎所有的项目中对数据库的 ...

  2. MongoDB高级查询详细

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

  3. mongoDB 高级查询(一)

    MongoDB,作为NoSql数据库,主要解决的问题不是高性能的并发读写,而是保证海量数据存储的同时,具有良好的查询性能.MongoDB支持的查询语言特别强大,几乎能实现关系型数据库单表查询的大多数功 ...

  4. mongoDB高级查询与索引

    整理来自 https://www.shiyanlou.com/courses/running/78 覆盖索引查询 所有的查询字段都是索引的一部分:所有的查询返回字段在同一个索引中. 由于索引存在于RA ...

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

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

  6. mongoDB 高级查询之取模查询$mod

    http://hancang2000.i.sohu.com/blog/view/235140698.htm $mod取模运算 查询age取模10等于0的数据 db.student.find( { ag ...

  7. mysql高级查询 二_MySQL高级查询(二)

    EXISTS 和NOT EXISTS子查询 EXISTS子查询 语法: SELECT --- FROM 表名 WHERE EXISTS (子查询); 例: SELECT `studentNo` AS ...

  8. mongoDB高级查询

    2019独角兽企业重金招聘Python工程师标准>>> 条件查询 1.相等 db.inventory.find({ type: "snacks" }) 2.比较 ...

  9. mongodb 高级查询 统计记录条数

    使用count()方法查询表中的记录条数,例如,下面的命令查询表users的记录数量: db.users.find().count();

  10. Mongodb高级查询Aggregation聚合组件分页

    用Mongo的聚合组件Aggregation要用到两个方法skip和limit.skip设置起点(分页的时候不包含起点,从起点的下一行开始),limit设置条数.如: Aggregation.skip ...

最新文章

  1. c语言图论,图论问题------大家过来看看
  2. AI 质检学习报告——实践篇——第二步:实现图片识字
  3. Laravel核心技术解析(1)—— Composer 组件管理与自动加载
  4. CentOS搭建全功能服务器(Nginx+Tomcat+PHP+SSL)
  5. C语言字符串中获取数字
  6. 李开复《人工智能》读后感
  7. jQuery事件自动触发
  8. 编程、Web前端/后端、游戏开发、嵌入式开发、大数据、人工智能、机器学习需要什么样的笔记本配置?
  9. Tiny210--3--基于Tiny210的CMOS摄像头图像采集
  10. 读取word、pdf某些位置的值
  11. Oracle安装与配置(Linux)
  12. 戴尔sc系列存储阵列柜服务器,Dell存储Compellent SC4020
  13. 电商类产品搜索功能如何优化?
  14. 【计算几何-点的定位】
  15. 郑州大学计算机硕士分数线,郑州大学今年的录取分数线是多少?不同的专业呢...
  16. 6月程序员平均工资出炉,这个水平我慕了!
  17. 【Java/Python】多线程
  18. Linuz之LCD驱动
  19. 37了解高可用技术方案,如冗余、容灾
  20. 帝国CMS(EmpireCMS) v7.5 前台XSS漏洞分析

热门文章

  1. 【图像压缩】基于matlab GUI DCT图像无损压缩【含Matlab源码 726期】
  2. ai人工智能最新相关消息_我如何了解最新的AI研究
  3. 人工神经网络方法学习步长_人工神经网络-一种直观的方法第1部分
  4. 她玩游戏好都不准我玩游戏了_我们可以玩游戏吗?
  5. python:DataFrame对单列或多列进行整列的运算(map, apply, transform, agg)
  6. 随笔记--深浅拷贝问题
  7. android期末课设选题_Android课程设计报告书.doc
  8. TCP/IP三次握手四次挥手
  9. spring3.1.1与commons-dbcp1.2的冲突?
  10. 开启、关闭数据库mysql