Mongodb高级查询【二】
上一篇文章,写了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高级查询【二】的更多相关文章
- mongoDB高级查询$type4array使用解析
今天在使用mongoDB高级查询$type:符号 -- 4代指Array类型发现一个问题. $type符号: $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. 下面是mong ...
- mongoDB 高级查询语法
http://www.cnblogs.com/ITAres/articles/2084794.html本文参考自官方的手册:http://www.mongodb.org/display/DOCS/Ad ...
- MongoDB高级查询用法大全
转载 http://blog.163.com/lgh_2002/blog/static/440175262012052116455/ 详见官方的手册: http://www.mongodb.org/d ...
- MongoDB高级查询详细
前言 前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客 MongoDB下载安装与简单增删改查 前 ...
- mongodb高级查询
前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客 MongoDB下载安装与简单增删改查 前奏:启 ...
- MongoDB中的高级查询(二)
$mod取模运算 查询index对5取模运算等于1的数据. $not $not是元条件句,即可以用在任何其他条件之上.查询index对5取模运算不等于1的数据. $exists判断字段是否存在 查询出 ...
- accp8.0转换教材第4章MySQL高级查询(二)理解与练习
知识点:EXISTS子查询.NOT EXISTS子查询.分页查询.UNION联合查询 一.单词部分 ①exist存在②temp临时的③district区域 ④content内容⑤temporary暂时 ...
- MongoDB 高级查询_aggregate聚合管道
MongoDB 聚合管道(AggregationPipeline) 使用聚合管道可以对集合中的文档进行变换和组合.实际项目应用主要是表关联查询.数据的统计. MongoDB 中使用 db.COLLEC ...
- 2015.4.10-SQL 高级查询(二)
1.TOP字句: 用于规定要返回的记录的数目 select top number(个数)/percent(百分数) 列名 from 表名 2.like模糊查询,用于where字句中,以及通配符 ...
随机推荐
- weex加入iconfont
weex加入图标可能是项目开发中最头疼的事情了,还好有 阿里巴巴矢量图标库解决了开发时的图标问题,下面我们一起来踩坑吧<text class="left"></ ...
- 经验总结22--抓取HTML数据,HtmlAgilityPack(续)
假设获取的数据是HTML的话.我们就须要第三方工具有辅助获取我们须要的数据. 我选用了HtmlAgilityPack这么个工具. 首先肯定去网上下载一个,然后引用到项目中.下载地址:http://ht ...
- 纯CSS实现图片
在Web开发中.通过CSS代码也能够实现一些简单的图片,当然,假设你有耐心,也能够实现较为复杂的图片噢. 那么请问为什么有图片不去用而须要用CSS来实现呢?一是由于性能的原因,图片带给server和c ...
- 游戏AI(二)—行为树优化之
上一篇我们讲到了AI架构之一的行为树,本篇文章和下一篇文章我们将对行为树进行优化,在本篇文章中我们讲到的是内存优化 问题 上一篇中我们设计的行为树由于直接采用new进行动态内存分配,没有自己进行管理. ...
- 如何处理使用js兼容所有浏览器的问题
首先:如何处理兼容问题 1.如果两个都是属性,用逻辑||做兼容 2.如果有一个是方法,用三元做兼容 3.如果是多个属性或方法,封装函数做兼容 分享两个小知识点: 1.取消拖拽的默认行为: docume ...
- 自学Zabbix3.5.5-监控项item-User parameters(自定义key)
为什么要自定义KEY,即User parameters功能 有时候我们想让被监控端执行一个zabbix没有预定义的检测,zabbix的用户自定义参数功能提供了这个方法.我们可以在客户端配置文件zabb ...
- MPSOC之8——启动及错误处理
有了BOOT.BIN(fsbl+pmu+atl+uboot).uImage.uramdisk.image.gz,dtb文件,就可以启动了.把上述文件统统拷贝到SD卡,并设置开发板为SD卡启动. 0. ...
- [转载]ArchLinux 添加 archlinuxcn 源 密钥错误
http://www.jianshu.com/p/8ed688b0a096 杜龙少 正在检查密钥环里的密钥 [######################] 100% 正在下载所需的密钥...... ...
- ASP.NET Core 系列视频完结,新项目实战课程发布。
今天把MVC的章节完成了,给大家从头到尾做了一个登录注册的示例,带前后端Model验证,算是完整的示例.同时借助于eShopOnContainers的示例也做了一个DBContextSeed的包装器来 ...
- sqlserver 存储过程 递归查询分组+hierarchyid重建会员关系
CREATE PROCEDURE [dbo].[GetGroupInfo] @s_code NVARCHAR() = --会员卡号 AS BEGIN declare @p int; --查询唯一性结果 ...