未加星标

mongodb高级查询--聚集框架

字体大小 | |
[数据库(综合) 所属分类 数据库(综合) | 发布者 店小二04 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

上一篇讲解了使用mongodb的文本搜索,现在再来补充一个mongodb中的高级搜索--聚集框架

聚集框架的概念很像介绍Redis时介绍的管道概念,因为顾名思义,聚集框架,就是将一堆命令集合在一起运行,但是注意不像关系型数据库中介绍的事务一样,只是一堆命令按照一定的规则组合在一起执行而已。

为了讲解方便,先插入几组数据

date1={
'id':1,
'sub_id':2,
'belong_to':[1,2,3,4]
}
date2={
'id':1,
'sub_id':3,
'belong_to':null
}
date3={
'id':2,
'sub_id':2,
'belong_to':[]
}
date4={
'id':2,
'sub_id':3,
'belong_to':5
}
db.date.insert(date1)
db.date.insert(date2)
db.date.insert(date3)
db.date.insert(date4)
先不用管这些数据有什么特点,接下来介绍如何使用聚集框架

首先要构建聚集管道来存放聚集命令,构建聚集管道是使用函数 aggregate

db.collection_name.aggregate()
至于聚集命令就写在括号内部,下面直接看这几个例子

--------------------------------------------------------------$group-------------------------------------------------------------------

$group
db.date.aggregate(
{
$group:{_id:'$id'}
})
返回结果如下
mongodb高级查询--聚集框架
可以看到就是将文档按照id字段进行了分组,并且返回。

但是在这里说几点注意点:

1、命令中的_id是指定的,不能修改的,如果你换成_ids这样的你自己定义的,mongodb是不认识的,会报错,所以注意,只能使用_id指定分组字段

2、_id:'$id' 后面的 id 是文档中的定义的字段,这个名字可以根据你的文档内容而定,我的文档中恰好是 id,选好你文档中的key_name之后,在前面加上$,并且添加上双引号或者单引号,否则会报错,所以标准格式是这样的:

{ $group:{_id: ' $key_name ' } }

3、可以看到返回值只有一个_id:value,可以看到返回的字段是在$group中指定的,如果想返回多个字段的话,可以在$group中添加,形式如下

db.date.aggregate(
{
$group:{
_id:'$id',
second:{$sum:'$sub_id'}
}
})
执行结果如下
mongodb高级查询--聚集框架
这里的注意点在于一个观念上的改变,第二个字段--second:{$sum:'$sub_id'},不是分组的依据,而只是按照 _id 分好组后,所执行的一个计算,注意!不是分组的依据!具体原因看一下这条命令其实就可以理解了

second: { $sum :'$sub_id' }

根据前面的介绍我们知道,$sub_id 是文档中的字段,$sum 是一个求和的操作符,类似的操作符还有很多,而 second 则是自己定义的字段名,这个你可以定义除了_id之外的随便什么名字,看着顺眼就好了。解析完这条命令我们就可以看出他干了什么,他在根据 _id 分好组后,再来计算各自组内 sub_id 的值,所以第二个字段不是分组的依据,而是一个分好组后所执行的一个操作。

这里只添加了一组,其实还可以添加更多组,看个人需求了。

--------------------------------------------------------------$match-------------------------------------------------------------------

db.date.aggregate(
[
{$match:{id:{$gt:1}}},
{
$group:{
_id:'$id',
sub_id:{$sum:'$sub_id'}
}
}
]
)
$match 的作用就是筛选集合中的参与接下来分组的文档,至于用法,看上面的例子就知道了,只有 id 字段值大于1的才能参与接下来的分组,运行结果就很明显了,其中 id 有两组是1,所以不会参与分组,只有 id 为2的才可以
mongodb高级查询--聚集框架

--------------------------------------------------------------$unwind-------------------------------------------------------------------

$unwind
$unwind的作用就是将数组中的数据拆分出来,赋值给原始文档,我语言表达不好,直接看例子就懂了,还有 belong_to 的名字是我乱取的
db.date.aggregate(
{$unwind:'$belong_to'}
)
注意,belong_to字段是数组字段,执行上述命令后可以看一下结果
mongodb高级查询--聚集框架
可以看到原来的 belong_to 数组中的内容被拆分然后赋值给原文档

这里讲以下特殊情况,我们看到各个文档中的 belong_to 字段都是不同的,有的是数组,有的是数字,有的是null,甚至不存在 belong_to 字段,这个时候从例子中我们看出来,只有存在 belong_to 字段,且 belong_to 字段有值的,才会被选择执行 unwind 操作,如果 belong_to 字段只有单个内容,不是数组的,那就会被当作只包含一个元素的数组来处理,null、数组为空,不存在 belong_to 字段的,unwind 命令就不会处理该文档了。

接下来是一些 $unwind 的别的参数的使用例子,各个参数的具体效果,看参数的名字以及例子结果就知道了

例1,就是添加了一个path的参数,这参数没用的,运行结果跟没加一样

db.date.aggregate(
{$unwind:{path:'$belong_to'}}
)
mongodb高级查询--聚集框架
例2,参数 includeArrayIndex: "arrayIndex" ,顾名思义,显示数组中元素的原始下标
db.date.aggregate(
{$unwind:{path:'$belong_to',includeArrayIndex: "arrayIndex" }}
)
mongodb高级查询--聚集框架
可以看到多了一个返回值,'arrayIndex':NumberLong( x ),其中的 x 就是该数组元素在数组中时的下标,像最后一条数据,原本不是数组的,那下标就是 null

例3,参数 preserveNullAndEmptyArrays: true,翻译过来就是显示那些被 unwind 选择不处理的文档,就是前面那些 belong_to 字段为空或者不存在的文档

db.date.aggregate(
{$unwind:{path:'$belong_to',preserveNullAndEmptyArrays: true }}
)
mongodb高级查询--聚集框架
可以看到会将 belong_to 字段的信息显示出来,注意倒数第二个文档,其原始内容为 belong_to:[ ],为空数组时,不显示 belong_to 字段。

--------------------------------------------------------------$project-------------------------------------------------------------------

$project

其实讲到这里有一个bug,你们看出来了吗?我们前面讲过在$group中可以定义返回字段,可是有一个字段一定会返回:_id 字段,如果我只是希望拿 _id 字段作为分组依据,但是我需要 _id 字段怎么办?可以使用 $project 来指定返回的字段内容

db.date.aggregate(
[
{
$group:{
_id:'$id',
second:{$sum:'$sub_id'}
}
},
{$project:{_id:0,second:1}}
]
)
运行结果如下
mongodb高级查询--聚集框架

其中,$project 后面跟着的字段名需要跟你在 $group 中设置的一样。当你将某一字段的值设置成0时,表示不返回该字段,但是注意,不能只设置0,当你设置了0时,一定要将某一字段设置成1,否则会报错。如下所示

db.date.aggregate(
[
{
$group:{
_id:'$id',
second:{$sum:'$sub_id'}
}
},
{$project:{_id:0}}
]
)
这样只设置了_id为0就会报错,一定要在设置了0之后再将某一字段设置成1
--------------------------------------------------------------其余项-------------------------------------------------------------------

$limit、$sort、$skip等都比较简单,直接看下面的例子

$sort

--排列返回结果

db.date.aggregate(
[
{
$group:{
_id:'$id',
sub_id:{$sum:'$sub_id'}
}
},
{$sort:{_id:-1}},
]
)

_id:1 表示按照 _id字段的值,顺序排列,-1表示逆序,别问我0会怎么样


mongodb高级查询--聚集框架
$limit

--限制返回结果

$skip

--跳过返回结果,用法跟$limit一样,就不写了

db.date.aggregate(
[
{
$group:{
_id:'$id',
sub_id:{$sum:'$sub_id'}
}
},
{$limit:1}
]
)
mongodb高级查询--聚集框架

本文数据库(综合)相关术语:系统安全软件

主题: Redis数据其实需求数据库
分页:12
转载请注明
本文标题:mongodb高级查询--聚集框架
本站链接:http://www.codesec.net/view/483654.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 数据库(综合) | 评论(0) | 阅读(24)