设为首页 加入收藏

TOP

MongoDB 数据库的学习与使用详解(四)
2019-09-04 01:02:49 】 浏览:101
Tags:MongoDB 数据库 学习 使用 详解
可以使用相似度的打分来判断检索成果。


范例:为结果打分


? 按照打分的成绩进行排列,实际上就可以实现更加准确的信息检索。


? 但是在这里面还有一个小问题,如果一个集合的字段太多了,那么每一个字段都分别设置全文检索麻烦点,简单一些,可以为所有的字段设置全文检索。


范例:为所有字段设置全文检索


? 这是一种最简单的设置全文索引的方式,但是尽可能别用,一个字:慢!


? 地理信息索引分为两类:2D 平面索引,另外就是 2DSphere 球面索引。在 2D 索引里面基本上能够保存的信息都是坐标,而且坐标保存的就是经纬度坐标。


范例:定义一个商铺的集合


范例:为 shop 集合定义 2D 索引


? 这个时候 shop 集合就可以实现坐标位置的查询了,而要进行查询有两种方式:


范例:假设我的现在的坐标是:[11,11]


? 但是如果执行了以上的查询,实际上会将数据集合里面的前 100 个点的信息都都返回来了,可是太远了,设置一个距离范围 —— 5 个点内的。


范例:设置查询距离范围


? 但是需要注意一点,在 2D 索引里面虽然支持最大距离,但是不支持最小距离。


? 但是也可以设置一个查询的范围,使用 “$geoWithin” 查询,而可以设置的范围:


范例:查询矩形


范例:查询圆形


? 在 MongoDB 数据库里面,除了一些支持的操作函数之外,还有一个重要的命令:runCommand(),这个函数可以执行所有的特定的 MongoDB 命令。


范例:利用 runCommand() 实现信息查询


? 这类的命令可以说是 MongoDB 之中最为基础的命令。


? MongoDB 的产生背景是在大数据环境,所谓的大数据实际上也就是进行的信息收集汇总。那么就必须存在有信息的统计操作,而这样的统计操作就称为聚合(直白:分组统计就是一种聚合操作)。


? 对于集合的数据量而言,在 MongoDB 里面直接使用 count() 函数就可以完成。


范例:统计 students 表中的数据量


范例:模糊查询


? 在进行信息查询的时候,不设置条件永远要比设置条件的查询快很多,也就是说在之前的代码编写里面不管是查询全部还是模糊查询,实际上最终都使用的是模糊查询一种(没有关键字)


? 在学习 SQL 的时候对于重复的数据可以使用 “DISTINCT” ,那么这一操作在 MongoDB 之中依然支持。


范例:查询所有 name 的信息


? 此时实现了对于 name 数据的重复值的筛选。


? 使用 “group” 操作可以实现数据的分组操作,在 MongoDB 里面会将集合依据指定的 key 的不同进行分组操作,并且每一个组都会产生一个处理的文档结果。


范例:查询所有年龄大于等于 19 岁的学生信息,并且按照年龄分组


? 以上的操作代码里面实现的就属于一种 MapReduce ,但是这样只是根据传统的数据库的设计思路,实现了一个所谓的分组操作,但是这个分组的最终结果是有限的。


? MapReduce 是整个大数据的精髓所在(实际中别用),所谓的 MapReduce 就是分为两步处理数据:


范例:建立一组雇员数据


? 使用 MapReduce 操作最终会将处理结果保存在一个单独的集合里面,而最终的处理效果如下:


范例:按照职位分组,取得每个职位的人名


? 第一组:{key:"CLERK",values:[姓名,姓名,...]}


? 显示错误信息,表示缺少 “out”,“out” 指的是最终的保存结果的集合。


? 现在执行之后,所有的处理结果都保存在了 “ t_job_emp ” 集合里面。


范例:统计出各性别的人数、平均工资、最低工资、雇员姓名


? 虽然大数据的时代提供有最强悍的 MapReduce 支持,但是从现实的开发来讲,真的不可能使用起来。


? MapReduce 功能强大,但是它的复杂度和功能一样强大,那么很多时候我们需要 MapReduce 的功能,可是又不想把代码写的太复杂,所以从 Mongo 2.x 版本之后开始引入了聚合框架并且提供了聚合函数:aggregate() 。


? “ $group ” 主要进行分组的数据操作。


范例:实现聚合查询的功能 —— 求出每个职位的雇员人数


? 这样的操作更加符合于传统的 group by 子句的操作使用。


范例:求出每个职位的总工资


? 在整个聚合框架里面如果要引用每行的数据使用:“ $字段名称 ” 。


范例:继续计算出每个职位的平均工资


范例:求出最高与最低工资


? 以上的几个与 SQL 类似的操作计算就成功实现了。


范例:计算出每个职位的工资数据(数组显示)


范例:求出每个职位的人员


? 使用 “ $push ” 的确可以将数据变为数组进行保存,但是有一个问题出现了,重复的内容也会进行保存,那么在 MongoDB 里面提供有取消重复的设置。


范例:取消重复的数据


? 默认情况下是将所有数据都保存进去了,但是现在只希望可以保留第一个或者是最后一个。


范例:保存第一个内容(无序的)


范例:保存最后一个内容


? 虽然可以方便的实现分组处理,但是有一点需要注意,所有的分组数据是无序的,并且都是在内存之中完成的,所以不可能支持大数据量。


? 可以利用 “ $project ” 来控制数据列的显示规则,那么可以执行的规则如下:


? |- 普通列({成员 : 1 | true}):表示要显示的内容


? |- “ _id ” 列({"_id" : 0 | false}):表示 “ _id ” 列是否显示


? |-条件过滤列({成员 : 表达式}):满足表达式之后的数据可以进行显示


范例:只显示 name 列,不显示 “ _id ” 列


? 此时只有设置进去的列才可以被显示出来,而其它的列不能够被显示出来。实际上这就属于数据库的投影机制。


? 实际上在进行数据投影的过程里面也支持四则运算:加法(“$add”)、减法(“$subtract”)、乘法(“$multiply”)、除法(“$divide”)、求模(“$mod”)


范例:观察四则运算


? 除了四则运算之外也支持如下的各种运算符:


范例:找出所有工资大于等于 2000 的雇员姓名、年龄、工资。


范例:查询职位是 manager 的信息


? MongoDB 中的数据是区分大小写的,如果上面的 “MANAGER” 改为 “manager” 查到的数据就会都返回 false ,使用 "$toUpper" 转大写后显示正确信息了。


? 还可以不区分大小写


范例:使用字符串截取


? 利用 “$project” 实现的投影操作功能相当强大,所有可以出现的操作几乎都能够使用。


? 更多聚合操作可以查看文档:https://docs.mongodb.com/manual/aggregation/


? “ $match ” 是一个过滤操作,就是进行 WHERE 的过滤。


范例:查询工资在 2000~5000 的雇员


? 这个时候实现的代码严格来讲只是相当于 “ SELECT * FROM 表 WHERE 条件 ”


范例:控制投影操作


? 此时相当于实现了 “ SELECT 字段 FROM ... WHERE ... ” 语句结构。


范例:继续分组


? 通过一系列的演示可以总结一点:


? 使用 “ $sort ” 可以实现排序,设置 1 表示升序,设置 -1 表示降序


范例:实现排序


范例:将所有的操作一起使用


? 此时实现了降序排序,使用的是生成定义的别名。


? “$limit”:负责数据的取出个数


? “$skip”:数据的跨过个数


范例:使用 “$limit” 设置取出的个数


范例:跨过三行数据


范例:综合应用


? 只能够说现在的查询可以在实际的开发之中使用了。


? 在查询数据的时候经常会返回数组信息,但是数组并不方便信息的浏览,所以提供有 “ $unwind” 可以将数组数据变为独立的字符串内容。


范例 :添加一

首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Oracle 误删除表的几种恢复方法 下一篇ORA-01157与ORA-01110无法识别/锁..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目