MongDB-高级
No1:
聚合
- 聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()
---语法
db.集合名称.aggregate([{管道:{表达式}}])
No2:
管道
- 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的输入
ps ajx | grep mongo
- 在mongodb中,管道具有同样的作用,文档处理完毕后,通过管道进行下一次处理
- 常用管道
- $group:将集合中的文档分组,可用于统计结果
- $match:过滤数据,只输出符合条件的文档
- $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
- $sort:将输入文档排序后输出
- $limit:限制聚合管道返回的文档数
- $skip:跳过指定数量的文档,并返回余下的文档
- $unwind:将数组类型的字段进行拆分
No3:
表达式
- 处理输入文档并输出
---语法
表达式:'$列名'
常用表达式
- $sum:计算总和,$sum:1同count表示计数
- $avg:计算平均值
- $min:获取最小值
- $max:获取最大值
- $push:在结果文档中插入值到一个数组中
- $first:根据资源文档的排序获取第一个文档数据
- $last:根据资源文档的排序获取最后一个文档数据
No4:
$group
- 将集合中的文档分组,可用于统计结果
- _id表示分组的依据,使用某个字段的格式为'$字段'
---例1:统计男生、女生的总人数
db.stu.aggregate([
{$group:
{
_id:'$gender',
counter:{$sum:1}
}
}
])
Group by null
- 将集合中所有文档分为一组
---例2:求学生总人数、平均年龄
db.stu.aggregate([
{$group:
{
_id:null,
counter:{$sum:1},
avgAge:{$avg:'$age'}
}
}
])
透视数据
---例3:统计学生性别及学生姓名
db.stu.aggregate([
{$group:
{
_id:'$gender',
name:{$push:'$name'}
}
}
])
使用$$ROOT可以将文档内容加入到结果集的数组中
db.stu.aggregate([
{$group:
{
_id:'$gender',
name:{$push:'$$ROOT'}
}
}
])
No5:
$match
- 用于过滤数据,只输出符合条件的文档
- 使用MongoDB的标准查询操作
---例1:查询年龄大于20的学生
db.stu.aggregate([
{$match:{age:{$gt:20}}}
])
---例2:查询年龄大于20的男生、女生人数
db.stu.aggregate([
{$match:{age:{$gt:20}}},
{$group:{_id:'$gender',counter:{$sum:1}}}
])
No6:
$project
- 修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
---例1:查询学生的姓名、年龄
db.stu.aggregate([
{$project:{_id:0,name:1,age:1}}
])
---例2:查询男生、女生人数,输出人数
db.stu.aggregate([
{$group:{_id:'$gender',counter:{$sum:1}}},
{$project:{_id:0,counter:1}}
])
No7:
$sort
- 将输入文档排序后输出
---例1:查询学生信息,按年龄升序
b.stu.aggregate([{$sort:{age:1}}])
---例2:查询男生、女生人数,按人数降序
db.stu.aggregate([
{$group:{_id:'$gender',counter:{$sum:1}}},
{$sort:{counter:-1}}
])
No8:
$limit
- 限制聚合管道返回的文档数
---例1:查询2条学生信息
db.stu.aggregate([{$limit:2}])
No9:
$skip
- 跳过指定数量的文档,并返回余下的文档
---例2:查询从第3条开始的学生信息
db.stu.aggregate([{$skip:2}])
---例3:统计男生、女生人数,按人数升序,取第二条数据
db.stu.aggregate([
{$group:{_id:'$gender',counter:{$sum:1}}},
{$sort:{counter:1}},
{$skip:1},
{$limit:1}
])
注意顺序:先写skip,再写limit
No10:
$unwind
- 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
---语法1
-对某字段值进行拆分
db.集合名称.aggregate([{$unwind:'$字段名称'}])
-构造数据
db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
-查询
db.t2.aggregate([{$unwind:'$size'}])
---语法2
-对某字段值进行拆分
-处理空数组、非数组、无字段、null情况
db.inventory.aggregate([{
$unwind:{
path:'$字段名称',
preserveNullAndEmptyArrays:<boolean>#防止数据丢失
}
}])
-构造数据
db.t3.insert([
{ "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] },
{ "_id" : 2, "item" : "b", "size" : [ ] },
{ "_id" : 3, "item" : "c", "size": "M" },
{ "_id" : 4, "item" : "d" },
{ "_id" : 5, "item" : "e", "size" : null }
])
----使用语法1查询
db.t3.aggregate([{$unwind:'$size'}])
----查看查询结果,发现对于空数组、无字段、null的文档,都被丢弃了
----问:如何能不丢弃呢?
----答:使用语法2查询
db.t3.aggregate([{$unwind:{path:'$sizes',preserveNullAndEmptyArrays:true}}])
No11:
- 为了更安全的访问mongodb,需要访问者提供用户名和密码,于是需要在mongodb中创建用户
- 采用了角色-用户-数据库的安全管理方式
- 常用系统角色如下:
- root:只在admin数据库中可用,超级账号,超级权限
- Read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- 创建超级管理用户
use admin
db.createUser({
user:'admin',
pwd:'',
roles:[{role:'root',db:'admin'}]
})
No12:
普通用户管理
---查看当前数据库的用户
use test1
show users
---创建普通用户
db.createUser({
user:'t1',
pwd:'',
roles:[{role:'readWrite',db:'test1'}]
})
---修改用户:可以修改pwd、roles属性
db.updateUser('t1',{pwd:''})
No13:
副本集(复制)
什么是复制
- 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性
- 复制还允许从硬件故障和服务中断中恢复数据
为什么要复制
- 数据备份
- 数据灾难恢复
- 读写分离
- 高(24* 7)数据可用性
- 无宕机维护
- 副本集对应用程序是透明
复制的工作原理
- 复制至少需要两个节点A、B...
- A是主节点,负责处理客户端请求
- 其余的都是从节点,负责复制主节点上的数据
- 节点常见的搭配方式为:一主一从、一主多从
- 主节点记录在其上的所有操作,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致
- 主节点与从节点进行数据交互保障数据的一致性
复制的特点
- N 个节点的集群
- 任何节点可作为主节点
- 所有写入操作都在主节点上
- 自动故障转移
- 自动恢复
No14:
分片
- 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求
- 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量,这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据
为什么使用分片
- 本地磁盘不够大
- 当请求量巨大时会出现内存不足。
- 垂直扩展价格昂贵(内存、磁盘、cpu)
No15:
与python交互
# coding=utf-8
from pymongo import * # 获得客户端,建立连接
client = MongoClient('mongodb://py3:123@localhost:27017/py3')
# 切换数据库
db = client.py3
# 获取集合
stu = db.stu # 增加
stu.insert_one({'name': '张三'}) # 修改
stu.update_one({'name': '张三'}, {'$set': {'name': 'abc'}}) # 删除
stu.delete_one({'name': 'abc'}) # 查询
cursor = stu.find({'age': {'$gt': 20}}).sort('_id', DESCENDING).skip(1).limit(1)
for s in cursor:
print(s['name'])
以上是高级部分,本来还有一些是服务器的部署之类,就没放出来了
MongDB-高级的更多相关文章
- mongdb高级操作(group by )
首先介绍哈方法 /** * 利用java驱动自带函数分组查询 * @param key 用来分组文档的字段 [group by key] * @param cond 执行过滤的条件 [where na ...
- MongoDB高级查询详细
前言 前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客 MongoDB下载安装与简单增删改查 前 ...
- mongodb高级查询
前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客 MongoDB下载安装与简单增删改查 前奏:启 ...
- MongDB篇,第三章:数据库知识3
MongDB 数据库知识3 修改器 $inc 对某个域的值进行加减修改 $mul 对某个域的值进行乘法修改 $min 如果筛选的文档指定的值小于min则不修改,如果大于min 给定的值则修改为m ...
- MongoDB的高级使用
MongoDB的高级使用 1. Mongdb的索引备份以及和python交互 t255为mongodb中的集合 1.1 创建索引 索引的特点:提高查找的效率 不创建索引的情况下的查询: for(i=0 ...
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)
100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ...
- 马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)
马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)目录详情:18_02_ssl协议.openssl及创建私有CA18_03_OpenSSH服务及其相关应用09_01_磁盘及文 ...
- JS高级前端开发群加群说明及如何晋级
JS高级前端开发群加群说明 一.文章背景: 二. 高级群: 三. 加入方式: 四. 说明: 一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在“前端开发”关键字搜索结果第一名.当然取得这 ...
- C#高级知识点&(ABP框架理论学习高级篇)——白金版
前言摘要 很早以前就有要写ABP高级系列教程的计划了,但是迟迟到现在这个高级理论系列才和大家见面.其实这篇博客很早就着手写了,只是楼主一直写写停停.看看下图,就知道这篇博客的生产日期了,谁知它的出厂日 ...
随机推荐
- Windows7上完全卸载Oracle 12c操作步骤
注:本文来源于:< Windows7上完全卸载Oracle 12c操作步骤 > 1.关闭Oracle所有的服务,按[win+R]运行[services.msc]找到所有Oracle开头的 ...
- Confluence 6 数据库表-空间(Spaces)
这个表格与空间的管理有关. spaces 有关空间使用的信息:key,空间的名称和数字 ID. https://www.cwiki.us/display/CONF6ZH/Confluence+Data ...
- 用ngif 多次判断 Expression has changed after it was checked
昨天遇到一个问题 ,用ng Expression has changed after it was checked 查了一下说在angular2中,这个错误只会在dev开发模式下出现,在pro发布版本 ...
- MySQL外键使用详解
一.基本概念 1.MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种.不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引.用于外键关系的字段必须 ...
- python并发编程之多线程1
一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 1.创建线程的开销比创建进程的开销小, ...
- LeetCode(104):二叉树的最大深度
Easy! 题目描述: 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null, ...
- CF558E
非常好的一道题,是线段树的常见玩法 将字符串转化为1~26个数 对区间开一棵线段树,用两个数组分别维护区间中1~26每个数的个数以及一个区间覆盖标记,表示这个区间是否被某一个值覆盖了 在每次排序时,首 ...
- base64解密
问题 : base64解密 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个 ...
- 在lnmp环境下,将原来的PHP7.0升级到PHP7.2
基础环境: 系统:centos6.8 环境:lnmp 停止PHP7.0的版本,在做如下操作: 1.下载php-7.2.6.tar.bz2软件包放在/opt 路径下 mkdir /usr/local ...
- 饮冰三年-人工智能-linux-01通过VM虚拟机安装contes系统
先决条件:VM虚拟机的安装.contes系统的镜像文件 1:创建新的虚拟机 2:下一步,稍后安装操作系统 3:选择对应的系统 4:选择对应的路径 至此虚拟机已经创建完成(相当于买了一台新电脑) 5:编 ...