MongoDB(芒果数据库)

数据存储阶段

文件管理阶段(.txt   .doc   .xls)

数据库管理阶段

文件管理阶段

(.txt .doc .xls)

 

优点

1、使用简单方便

2、数据能够长期保存

3、可以存储大量数据

 

缺点

1、数据一致性差

2、数据的查找修改不方便

3、数据冗余(大量重复的数据)

数据库管理阶段

 

优点

1、数据组织结构化,降低冗余

2、提高增删改查效率

3、方便扩展

4、方便程序调用,做自动化的处理

缺点

1、数据库使用特定的语句操作,相对复杂

数据

能够输入到计算机中并被识别处理的信息的集合

数据结构

研究一个数据集合中,数据之间关系的学科

数据库

按照数据结构存储数据的仓库。

在数据库管理系统管理下一定介质上的数据集合。

数据库管理系统

管理数据库的软件,用于建立维护数据库

数据库系统

由数据库的数据库管理系统等开发工具组成的集合

 

 

 

!关系数据库

采用关系模型来组织数据结构的数据库(二维表)

比如:oracle(甲骨文)  DB2  SQLServer(微软) Mysql   sqlite(嵌入式)

优点

  1. 容易理解,逻辑类似常见的表格
  2. 使用方便,都使用sql语句很成熟
  3. 数据一致性高,冗余低,完整性好

4、技术成熟,可以使用外部关联复杂操作

缺点

1、 每次都需要sql语句的解析,消耗大

2、 不能很好的满足并发需求,特别是海量数据爆发,读写能力不足

3、 关系型数据库每一步都要加锁,

以保证操作的原子性,增加了数据库负担

4、 数据的一致性有时会导致空间浪费

 

 

!非关系数据库

(Nosql ----à   not noly sql)

 

优点

  1. 高并发,读写能力强
  2. 普遍比关系型数据库容易扩展
  3. 弱化了数据结构,降低数据的一致性

 

 

缺点

  1. 通用性差,没有sql语句一样的一致化操作
  2. 操作过于冗长,容易混乱
  3. 没有join等复杂操作,很多也不支持事务等操作

 

Nosql使用情况

  1. 对数据一致性要求低
  2. 数据库需要处理海量并发
  3. 需要处理速度较快,比如做一个临时的中间过度存储器
  4. 数据库构建比较方便的构建非关系模型

 

Nosql分类

1、键值型数据库:Redis

2、列存储数据库

3、文档型数据库:MongDB

4、图形数据库

         

 

 

MongoDB 数据库 (非关系型数据库 à 文档型 数据库)

 

 

特点

1、由c++ 编写的数据库管理系统

2、支持丰富的增删改查操作

3、支持丰富的数据类型

4、支持众多的编程语言接口(python  PHP  c++  c# )

5、使用方便,便于部署,相对成熟

 

 

 

 

 

 

 

 

 

MongoDB安装

自动安装

sudo apt-get install mongodb

默认安装位置

/var/lib/mongodb

配置文件

  /etc/mongodb.conf

命令集(软件安装后提供功能性的命令)

/usr/bin  或者  /usr/local/bin

 

手动安装

  1. 下载Mongodb(开源)

www.mongdb.com  --- >  get mongodb  --- > community server

选择想要下载的版本

  1. 选择合适的位置解压(/use/local  /opt)

tar 解压后得到 MongoDB 文件夹

  1. 将命令集(解压后文件夹中bin目录) 添加到环境变量

PATH=$PATH:/opt/mongo/bin

export PATH

将以上两句添加 /etc/rc.local

4、重启系统

 

 

MongoDB命令

 

设置数据库存储位置

mongod  --  dbopath 目录

e.g. mongodb dboath dbs

 

设置数据库端口

mongod  --port  8080

*默认端口  27017

进入mondo shell 界面:

mongodb的交互界面,操作数据库

mongo

退出界面

quit() 或 ctrl + c

mongodb 数据库组织形式

键值对 – > 文档 -- > 集合 -- > 数据库

-----------------------------------------

ID  |  NAME  |   AGE  |

-----------------------------------------

1  |     lily   |   17   |

----------------------------------------

2  |    Lucy  |   20    |

----------------------------------------

{“_id”:1,

“NAME”:” lily”,

“AGE”:17

}

{“_id”:2,

“NAME”:” Lucy ”,

“AGE”:20

}

 

 

 

Mysql 和mongodb概念对比

mysql

mongodb

含义

 

database

 

database

 

数据库

 

table

 

table

 

表/集合

 

column

 

field

 

字段/域

 

row

 

document

 

记录/文档

 

Index

 

Index

 

索引

 

 

 

 

 

 

 

 

 

 

 

mongodb数据库关键词

 

 

 

数据库的创建

use databaseName

例子:

e.g.   use stu 

#创建一个stu数据库

 

  1. use 实际上是表示选择某个数据库使用。

当这个数据库不存在时会自动创建

  1.  使用use后数据不会马上被创建,

而是在实际写入数据时才会创建

查看当前系统中数据库

show dbs

 

 

系统数据库

存放用户及其权限

admin

存储本地数据

local

存储分片信息

config

 

 

数据库的命名规则

  1. 使用utf-8字符
  2. 不能有空格、点、/、\、‘\0’字符
  3. 长度不能超过64字节
  4. 不和系统数据库重名

 

 

db

mongodb系统全局变量,代表当前使用的数据库

 

  1. 如果没有使用任何数据库情况下 db表示test。

此时插入数据则创建test数据库

 

 

 

 

 

数据库的备份和恢复

备份 : mongodb  -h  dbhost –d  dbname  –o  dbdir

                       主机    要备份数据库  目录

 

例子:

将stu数据库备份到sthdent目录中

mongodump -h 127.0.0.1 -d stu -o sthdent

 

恢复:mongorestore  -h  dbhost:port –d  dbname  path

                        主机          数据库  目录

 

例子:

将stu 数据库恢复到sthdent 数据库中

mongorestore -h 127.0.0.1:27017 -d sthdent sthdent/stu

 

 

 

 

 

 数据库监测

 

 

mongostat

insert  query  update  delete  :每秒执行增删改查次数

command :每秒运行命令此时

flushes : 每秒清理缓存次数

vsize:使用的虚拟内存

res: 物理内存

 

 

监测每个数据的读写时长

mongotop

ns  :数据集合

total :总时长

read :读时长

write :写时长

 

删除数据库

删除db代表的数据库

db.dropDatbase()

 

 

 

 

 

 

 

创建集合

方法1

db.createCollection(collection_name)

 

例子:

创建一个class1的集合

db.createCollection("class1")

 

方法2

当向一个集合中插入数据的时候,如果这个集合不存在则会自动创建

db.collecinoName.insert(…)

 

例子:

如果class2不存在则自动创建

db.class2.insert({"name":'Tom','age':17,'sex':'m'})

 

查看数据库中的集合

show collections

show tables

 

 

集合命名规则

  1. utf-8 字符
  2. 不能有‘\0’
  3. 不要以system.开头,因为这是系统保留集合前缀
  4. 不要和关键字重复

删除集合

db.collectionName.drop()

 

例子:

删除class

db.class.drop()

 

集合的重命名

db.collenctonName.renameCollection(“new_name”)

 

例子

db.class2.renameCollection("class0")

文档

Mongodb中数据的组织形式 --  > 文档

www.mongodb.com  -- > docs  查找文档帮助

Mongodb文件

以键值对形式组成的类似字典的数据描述形式

  1. 键:即文档的域

 

 

键的命名规则

  1. utf-8 字符串
  2. 不含有‘\0’通常不用 . $
  3. 一个文档当中的键不能重复
  1. 文档中的键值对是有序的
  2. mongodb中数据严格区分大小写

 

 

 

 

 

 

 

 

 

 

 

 

 

即文档存储的数据    支持bson 数据

JavaScript ----- > 编程语言 前端

 |

json 前端和后端的传输格式

 |

bson

 

类型               

整型                   整数

    布尔类型                true  false

浮点型                    小数

Array                      数组

Timestamp                 时间戳

Date                      时间日期

Object                    内部文档

Null                      空值 null

String                    字符串

Symbol                   特殊字符串

Binary  data             二进制字符

code                    代码

regex                    正则表达式

objeId                    objeId 子串

 

  1. objeId  

{ "_id" : ObjectId("5b504b6f25a94135d37fdf6c")

_id : 当在mongo 代表中插入文档时,如果不指定_id则会自动添加这个域,作为键。

 

ObjectID 值是系统自动生成的不重复子串标识

 

24位    前8位   文档创建时间

         6位     机器ID       

         4位     进程ID       

         6位     计数器

集合中的文档

  1. 集合中的文档不一定有相同的域
  2. 集合中的文档多少不一定相同
  3. 集合中的文档,值的类型不一定相同

 

 

集合设计

 

  1. 集合中的文档尽可能描述同一类数据
  2. 同一类数据不要过多分散在多个集合中存放
  3. 集合中文档的结构层次不易过多

 

获取集合对象

db.getcollection(‘class1’) == > db.class1

 

例子:

db.getCollection('class1').insert({name:'Marry',age:16,sex:'w'})

 

增删改查文档

 

 

 

 

 

 

 

 

 

 

 

 

插入文档

db.collectionName.insert()

 

例子:

插入单个文档

db.class0.insert({name:"HhanMei",age:17,sex:'w'})

 

  1. 插入数据时域名可以不加引号
  2. 查看插入结果 db.class.find()
  3.  
  4. _id 为系统自动添加主键,如果自己写_id则为自己设定的值,

但是仍然不可重复

  1. 一个集合中的文档是有序的

 

save()插入文档

db.collectionName.save()

例子:

e.g.   db.class1.save({name:'Lily',age:13,sex:'w'})

插入多个文档

db.collectionName.insert([{},{},{}])

 

例子:

db.class2.insert([{name:'阿宝',age:32},{name:'阿哲',age:31},{name:'阿蓉',age:26}])

  1. 如果不加_id域时用法同insert()
  2. 如果加_id,此_id值存在则save表示修改该文档

 

 

 

 

 

 

 

 

 

 

 

 

 

查看操作

mysql:    select … from table where …

mongo:   db.collection.find(query,field)

查找所有内容

db.collection.find()  ---- > select *from table

 

 

 

 

 

 

查找数据

Find(query,field)

参数:  query:   筛选条件,相当于where子句

        field:   选定要展示的域

返回值: 返回查找找到的文档

 

query : 以键值对形式给出筛选条件

          {name:’Lily’}

      例子:查找以name为Lily的域

        db.class1.find({name:'Lily'})

 

field:   以键值对的形式给出要展示(不展示)的域,

       域名为键,值为1表示展示,0表示不展示

        例子:显示name为Lily但不展示_id

            db.class1.find({name:"Lily"},{_id:0})

 

  1. 如果某个域设置为0则表示不展示该域其它的均展示
  2. 如果某个域设置为1则表示该域其它的均不展示
  3. _id 必须设置为0才不会显示
  4. 除了_id其余设置的值必须相同

 

例子

> db.class1.find({name:'Lily'},{_id:0,name:1,age:1})

 

只查找

第一条复合添加的文档

findOne(query,field)

参数返回值同find()

例子:

 db.class1.findOne({sex:'w'},{_id:0})

 

**************************************************

Query

更多筛选功能

操作符

使用$符号标注的一个有特殊意义的字符串,用于表达一定的含义,

比如 $1t 表示小于

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

比较操作符

$eq  等于

例子:年龄等于13

> db.class1.find({age:{$eq:13}},{_id:0})

        等同于以下

> db.class1.find({age:13},{_id:0})

 

$lt   小于 <

例子: 年龄小于15

> db.class1.find({age:{$lt:15}},{_id:0})

 

  1. 字符串也可以比较大小

 

$lte  小于等于  <=

例子 年龄小于等于15

> db.class1.find({age:{$lte:15}},{_id:0})

 

$gt   大于>

例子:年龄大于15

> db.class1.find({age:{$gt:15}},{_id:0})

 

$gte  大于等于

例子:年龄大于等于15

> db.class1.find({age:{$gte:15}},{_id:0})

 

$ne   不等于 !=

例子:年龄不等于13

> db.class1.find({age:{$ne:13}},{_id:0})

 

  1. 如果某个文档不存在查找的域,则不等于可以匹配到该文档

 

$ in  包含

例子:查看年龄包含在11,12,13,14的

> db.class1.find({age:{$in:[11,12,13,14]}},{_id:0})

 

$nin  不包含

例子:查看年龄不包含在13,14的

> db.class1.find({age:{$nin:[13,14]}},{_id:0})

 

 

逻辑操作符

Query 逗号分隔的条件即为与关系

例子: 年龄大于13 小于16

> db.class1.find({age:{$gt:13,$lt:16}},{_id:0})

例子:年龄大于13 且性别女

db.class1.find({age:{$gt:13},sex:'w'},{_id:0})

 

$and 逻辑与

例子: 年龄大于13 且姓名大于Lily

db.class1.find({$and:[{age:{$gt:13}},{name:{$lt:'Lily'}}]},{_id:0})

 

$or 逻辑或

例子:年龄大于15或者为男生

db.class1.find({$or:[{age:{$gt:15}},{sex:'m'}]},{_id:0})

 

$not 逻辑非

例子:年龄不大于15

db.class1.find({age:{$not:{$gt:15}}},{_id:0})

 

$nor  即不也不

例子:既不大于16 也不是女生

db.class1.find({$nor:[{age:{$gt:16}},{sex:'w'}]},{_id:0})

 

练习:

 年龄小于16 并且为男生,或者年龄小于14

    db.class1.find({$or:[{age:{$gt:16},sex:'m'},{age:{$lt:14}}]},{_id:0})

 年龄大于16 或者为女生,并且姓名大于Jame

     db.class1.find({name:{$gt:'Jame'},$or:[{age:{$gt:16}},{sex:'w'}]},{_id:0})

 

数组

 

 

 

 

 

 

 

 

数组查找

查看数组中是否包含某一项

例子:查找包含78

> db.class3.find({score:78},{_id:0})

例子: 大于90

db.class3.find({score:{$gt:90}},{_id:0})

$all

查找数据中同时包含多项

例子: 同时包含64 和75

> db.class3.find({score:{$all:[64,75]}},{_id:0})

 

$size

通过数组元素个数查找

例子:查找数组元素有3个

> db.class3.find({score:{$size:3}},{_id:0})

 

$slice

取出数组的部分进行显示  放在field中

例子:查找数组元素前2项  ,跳过第1项显示后面一项

> db.class3.find({},{_id:0,score:{$slice:2}})

> db.class3.find({},{_id:0,score:{$slice:[1,1]}})

 

其它查找方法

$exists

判断一个域是否存在

例子:查找存储age域的文档

> db.class1.find({age:{$exists:true}},{_id:0})

 

  1. true 表示有这个域 false表示筛选无这个域

$mod

余数查找

例子:查找年龄除以2余1文档

> db.class1.find({age:{$mod:[2,1]}},{_id:0})

 

$type

找出值为指定类型的文档

例子:查找age 数据类型为1的文档

> db.class1.find({age:{$type:1}},{_id:0})

 

查找结果相关函数

distinct

功能:查看集合某个域的取值范围

例子:查看集合中年龄域的范围

> db.class1.distinct('age')

 

pretty()

功能:格式化显示查找结果

例子:

> db.class1.find().pretty()

 

limit()

功能: 显示查找结果的前n条

例子:显示查找结果的前3条

> db.class1.find({},{_id:0}).limit(3)

 

skip(n)

功能:跳过前n条显示

例子:跳过前3条,显示后面的记录

> db.class1.find({},{_id:0}).skip(3)

count()

功能:计数统计

例子:统计男生数量

> db.class1.find({sex:'m'},{_id:0}).count()

sort

({域:1/-1})

功能: 对查找结果排序

参数: 以键值对的形式给出

         1表示按照升序排序

         -1表示按照降序排序

例子:按照年龄升序,降序

> db.class1.find({},{_id:0}).sort({age:1})

> db.class1.find({},{_id:0}).sort({age:-1})

复合排序:当第一个排序项相同时比较第二排序项

例子: 年龄选项升序相同,比较姓名选项进行升序

> db.class1.find({},{_id:0}).sort({age:1,name:1})

 

 

函数的连续调用

 

当函数返回文档集合时还可以继续调用函数

例子:查找班级年龄最大的三个

> db.class1.find({},{_id:0}).sort({age:-1}).limit(3)

 

文档的删除操作

Mysql删除文档

delete from table where …

db.collection.remove(query,justOne)

功能: 删除文档

参数: query

 筛选要删除的文档,相当于where用法同查找

      justOne

 布尔值,默认为false 表示删除所有。

如果设置为true 只删除第一条符合条件的文档

 

例子:justOne为true 则只删除第一条符合条件

> db.class0.remove({age:17},true)

例子:删除集合中姓名为Tom

> db.class0.remove({name:Tom})

例子:删除集合中所有文档

db.class2.remove({})

 

练习:

  1. 创建数据库名字叫  grade

use geage

  1. 数据库中创建集合 class

 

3、集合中插入文档,格式如下

{name:’zhang’,age:10,sex:’m’,hobby:[‘a’,’b’]}

age 范围 4-15

hobby (爱好)

 范围[draw  dance  sing  pingpang  basketball  football  running  computer]

  1. 查找练习

查看班级所有人信息

    *db.class.find({},{_id:0})

查看班级年龄8岁的同学的信息

*db.class.find({age:8},{_id:0})

查看年龄大于10岁的学生信息

    * db.class.find({age:{$gte:10}},{_id:0})

查看年龄在 8-11岁之间的学生信息

    * db.class.find({age:{$in:[8,11]}},{_id:0})

查看年龄为9岁且为男生的学生

    *db.class. find({age:9,sex:'m'})

找到年龄小于7岁或大于12岁的学生

    *db.class. find({$or:[{age:{$lt:7}},{age:{$gt:12}}]})

找到年龄为8岁或者11岁的学生

    *db.class. find({age:{$in:[8,11]}})

找到有两项兴趣爱好的学生

*db.class. find({hobby:{$size:2}}

找到兴趣中有draw 的学生

    *db.class. find(hobby:'draw')

找到喜欢画画draw又喜欢跳舞的学生

    *db.class.  find(hobby:{$all:['draw','dance']})

统计兴趣 有三项学生人数

    *db.class.  find({hobby:{$size:3}}).count()

找到本班年龄第二大的同学

    *db.class. find().sort({age:-1}).skip(1).limit(1)

 

查看兴趣的范围

找到年龄最小的三个同学

    * db.class. find().sort({age:1}).limit(3)

  1. 删除所有年龄大于12或者小于7岁的学生

    *db.class. remove({$or:[{age:{$lt:7}},{age:{$gt:12}}]})

 

文档的修改操作

Mysql修改

update table set … where …

 

 

 

 

Mongodb修改

db.collection.update(query,update,upsert,multi)

功能: 修改文档

参数:

1.query: 筛选需要修改的文档相当于where

            用法同查找

      2.update:要修改什么内容,相当set.

往往需要配合修改操作符

      3.upsert: bool 值 默认false

如果query 的文档不存在则不做操作

如果设置为true 则文档不存在根据query和update内容插入新文档

      4.multi: bool值 默认false 如果删选到多条文档则只修改第一条

           设置为true 则表示修改所有筛选到的文档

e.g年龄修改为18

db.class0.update({name:'HanMei'},{$set:{age:18}})

 

e.g. 如果筛选内容不存在则插入

    db.class0.update({name:'Jame'},{$set:{age:18}},true)

 

e.g. 如果匹配到多条,则修改所有

db.class0.update({sex:'w'},{$set:{name:'小芳'}},false,true)

 

*************************************************************************

普通修改操作符

$set

修改一个域的值,或增加一个域(如果该域不存在则增加这个域)

例子:把年龄为18岁的姓名修改

> db.class.update({age:18},{$set:{name:'小薇'}})

 

$unset

删除一个域

例子:后面为空表示删除一个域

 

$rename

修改域的 名称

例子:把sex这个域修改为gender

> db.class1.update({},{$rename:{sex:'gender'}},false,true)

 

$setOnInsert

如果updare 执行了插入文档操作,表示补充插入内容

例子:

db.class0.update({name:'Tom'},{$set:{age:17},$setOnInsert:{gender:'m',tel:'12345'}},true)

  1. 在update 参数中可以同时小写多个修改器
  2.  

$inc

加减修改器

例子:把所有人的年龄都加2

db.class2.update({},{$inc:{age:2}},false,true)

例子:将姓名为Tom的年龄减少0.7

> db.class2.update({name:"Tom"},{$inc:{age:-0.7}})

 

  1. $inc 值可以是正数负数正数小数

 

$mul

乘法修改器

例子:将姓名为Tom的年龄乘以2

> db.class2.update({name:"Tom"},{$mul:{age:2}})

 

  1. $mul值可以是正数负数整数小数
  2.  

$max

指定了某个域值的下限,如果小指定值则修改为指定值

例子:将年龄不到20的修改为20

db.class0.update({},{$max:{age:20}},false,true)

 

$min

指定了某个域值的上限,如果大于指定值则修改为指定值

例子:年龄大于25的修改为25

db.class0.update({},{$min:{age:25}},false,true)

 

 

数组修改器

$pust

向数组中添加一项

例子:向姓名为小明的文档中添加成绩数组 5

db.class3.update({name:'小明'},{$push:{score:5}})

 

$pusAll

向数组中添加多项

例子:向姓名为小红的文档中添加成绩数组5 和10

db.class3.update({name:'小红'},{$pushAll:{score:[5,10]}})

 

$pull

从数组中删除一项

例子:删除姓名为小王的成绩为5

> db.class3.update({name:"小王"},{$pull:{score:5}})

 

$pullAll

删除数组中多项

例子:删除姓名为小王成绩中有64和10

> db.class3.update({name:"小王"},{$pullAll:{score:[64,10]}})

 

$each

对多个值逐一操作

例子:插入姓名为小明,在成绩中插入5和10

> db.class3.update({name:'小明'},{$push:{score:{$each:[5,10]}}})

 

$position

指定插入位置

例子:插入姓名为小红,在成绩的1号位插入10

db.class3.update({name:'小红'},{$push:{score:{$each:[10],$position:1}}})

 

  1. 需要搭配$each 使用

$sort

对数组进行排序

例子:对姓名为小红,在成绩中进程排序(升序,降序)

> db.class3.update({name:'小红'},{$push:{score:{$each:[],$sort:1}}})

> db.class3.update({name:'小红'},{$push:{score:{$each:[],$sort:-1}}})

 

  1. $each[] 中如果不加数字则对现有的进行排序,相反如果加了则对添加后的内容进程排序 !!和$each 一起使用

$pop

弹出一项

例子:对姓名为小红,成绩的第一项进行删除

db.class3.update({name:'小红'},{$pop:{score:-1}})

例子:对姓名为小红,成绩的最后一项进行删除

db.class3.update({name:'小红'},{$pop:{score:1}})

 

$addToSet

向数组中添加一项,如果和已有的内容重复

例子:向姓名为小红,在成绩中添加87(如果已有则添加失败)

> db.class3.update({name:'小红'},{$addToSet:{score:87}})

 

 

时间类型

mogodb 中存储时间格式

ISODate()

方法1:自动生成当前时间

new Date() 

例子:在class2域中 插入python入门,插入当前时间

(和北京时间相差8小时)

> db.class2.insert({title:'python入门',date:new Date()})

 

ISODate()

方法2:自动生成当前时间

      

例子:在class2域中 插入python精通,插入当前时间

(和北京时间相差8小时)

> db.class2.insert({title:'python精通',date:ISODate()})

 

Date()

方法3 将生成的当前时间变为字符串存储

 

例子:在class2域中 插入python入门,插入当前时间

(和北京时间相差8小时)

> db.class2.insert({title:'python疯狂',date:Date()})

显示:

{ "title" : "python疯狂", "date" : "Mon Jul 23 2018 11:42:04 GMT+0800 (CST)" }

 

ISODate()

功能: 生成时间类型存储

参数: 参数指定时间

       ‘2018-7-1 12:10:56’

       ‘20180701 12:10:56’

        ‘20180701’

例子:class2域中 插入python学习,插入指定时间

> db.class2.insert({title:'python学习',date:ISODate("2018-07-01 01:12:12")})

 

时间辍

valueOF()

将时间转换为时间辍

例子:在class2域中 插入python放生,插入时间戳

> db.class2.insert({title:'python放生',date:ISODate().valueOf()})

显示:从1970年0:0:0 到现在的时间

{ "title" : "python放生", "date" : 1532318023513 }

 

Null------------ > nll

如果某个域存在却没有值,可以设置为Null

例子:

> db.class2.insert({title:'python涅槃',price:null})

如果某个域不存在可以使用null匹配

例子:找到date域不存在的文档

> db.class2.find({date:null},{_id:0})

 

 

objiect  内部文档

意义

文档内某个域的值还是一个文档,咋这个文档为内部文档

 

  1. 需要使用内部文档某个域的时候,可以使用外部文档 . 的方法引用内部文档,但是注意此时需要加引号

 

数组下标应用

例子:查找book2文档中域为titlepythonWEB

> db.class4.find({'book2.title':'pythonWEB'},{_id:0})

 

例子:查找修改bookl文档中域为price38.8’修改为‘48.8

> db.class4.update({'book1.title':'爬虫'},{$set:{'book1.price':48.8}})

 

例子:查class3字典中域为score‘第0项为98’的内容

> db.class3.find({'score.0':98},{_id:0})

 

例子:查找修改class3字典中域为姓名小明的‘第一项成绩改为100

> db.class3.update({name:'小明'},{$set:{'score.0':100}})

 

查找结果的有序性

 

例子:即对find的查找结果使用[ ] 的方式引用具体某一条

> db.class2.find({},{_id:0})[1]

 

 

练习:

使用之前的grade 数据库

  1. 将小红年龄修改为8岁,兴趣爱好变为跳舞画画

{$set:{age:8,hobby:[‘fraw’,’dance’]}}

 

  1. 追加小明兴趣爱好 唱歌

{$push:{hobby:’sing’}}

 

  1. 追加小王兴趣爱好,吹牛,打篮球

{$pushAll:{hobby:[‘chuiniu’,’basktball’]}}

 

  1. 小李兴趣多了跑步唱歌,但是要确保和之前的不重复

{$addToSet:{hobby:{4each;[‘running’,’sing’]}}}

 

  1. 班级所有人年龄加1

{$sinc:{age}},false,true

 

  1. 删除小明的sex 属性

{$unset:{sex:’’}}

 

  1. 删除小李的第一个爱好

{$pop:{hobby:-1}}

 

  1. 删除小红的兴趣画画和唱歌

{$pullAll:{hobby:[‘draw’,’sing’]}}

 

 

 

索引

意义

指建立指定键值对及所在文档中存储位置的对照清单

使用索引可以方便我们快速查找,减少遍历次数,提高查找效率

ensuteIndex()

功能:创建索引

参数:索引域,索引类别和选项

 

例子:根据name 创建索引

> db.class1.ensureIndex({name:1})

 

*  1表示正序,-1逆序

 

getIndexes()

功能: 查看集合中的索引

 

例子:

> db.class1.getIndexes()

  1. _id是系统自动创建的索引

 

ensureIndex()

功能:自定义索引名称

 

例子:给age 重命名为索引名为age_index

> db.class1.ensureIndex({age:1},{name:'age_index'})

dropIndex()

功能:删除索引

参数:要删除索引,可以是所有名称或者索引键值对

 

例子:删除索引为age_index

> db.class1.dropIndex('age_index')

例子:删除键值对为name:-1的索引

>db.class1.dropIndex({name:-1})

dropIndexes()

功能:删除所有索引

例子:

> db.class1.dropIndexes()

 

  1. 删除所有索引 ,除了_id

 

 

索引类型

复合索引

根据多个域创建一个索引

例子:

> db.class1.ensureIndex({name:1,age:-1})

 

数组和

子文档索引

如果对某个域创建索引,值为数组或者子文档,则通常数组或子文档进行查找时也是索引查找

 

覆盖索引

查找返回的内容,仅仅是索引表存储的内容,不需要再去原数据库查找

唯一索引

创建索引时希望集合中创建索引的域的值均不重复

例子:

> db.class1.ensureIndex({name:1},{unique:true})

 

  1. 创建唯一索引的域的值不可以重复

 

稀疏索引

(间隙索引)

只针对有指定域的文档创建索引表

如果某个文档没有改域则不做索引处理

 

例子:创建age 域的稀疏索引

> db.class1.ensureIndex({age:1},{sparse:true})

 

索引约束

  1. 当数据发送更新,索引也要随之更新,影响插入修改,删除操作的效率
  2. 索引表也需要占有一定的磁盘空间
  1. 综上: 当数据量比较小,或者需要频繁的进行数据修改操作而不是查找操作的时候,不适合创建索引

 

 

 

 

 

 

聚合操作

意义

对文档的更高级的筛选整理统计

db.collection.aggregate()

功能:聚合函数,完成函数操作

参数: 集合条件 --- > 聚合操作符

 

$group

功能:分组聚合  需要配合分组统计操作符使用

$sum : 求和

例子:统计按性别筛选计算总和

> db.class1.aggregate({$group:{_id:'$sex',num:{$sum:1}}})

                        

_id:’sex’ sex内容分组

num: 自定义统计域

{$sum:1} : 统计什么

 

例子:统计所有男生女生年龄之和

db.class1.aggregate({$group:{_id:'$sex',num:{$sum:'$age'}}})

 

$avg

功能 :求平均

例子:统计男生和女生的平均年龄

> db.class1.aggregate({$group:{_id:'$sex',num:{$avg:'$age'}}})

 

$max

功能:求最大值

例子:求每一组年龄最大值

> db.class1.aggregate({$group:{_id:'$sex',max:{$max:'$age'}}})

 

$min

功能:求最小值

例子:求每一组年龄最小值

> db.class1.aggregate({$group:{_id:'$sex',min:{$min:'$age'}}})

 

$project

功能:用于修改文档的显示效果

例子:聚合显示除了idsex的文档内容

> db.class1.aggregate({$project:{_id:0,sex:0}})

 

例子:指定显示的域名按大写显示

>db.class1.aggregate({$project:{_id:0,Name:'$name',Age:'age'}})

 

$match

功能:过滤数据

例子:过滤年龄大于16的内容1

> db.class1.aggregate({$match:{age:{$gt:16}}})

 

$linit

功能: 表示显示前几条文档

例子:只显示文档中的前2

> db.class1.aggregate({$limit:2})

$skip

功能: 跳过几条文档

例子: 跳过前两条显示后面内容

> db.class1.aggregate({$skip:2})

 

$sort

功能:排序

例子:按照age进行升序排序 1为升序,-1位降序)

> db.class1.aggregate({$sort:{age:1}})

 

聚合管道

功能: 将前一个得到的结果,给后一个聚合操作继续使用

例子:显示所有男生并按升序排序,不显示_id

db.collection.aggregate([聚合1,聚合2…..])

> db.class1.aggregate([{$match:{sex:'m'}},{$project:{_id:0}},{$sort:{age:1}}])

 

例子:显示重名按组区分将姓名进行取和大于1

> db.class1.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])

 

练习: 增加分数域

Score:{Chinese:88,math:76,English:76}

  1. 学生按照性别分组,统计每组人数

aggregate({$group:{_id:'$sex',num:{$sum:1}}})

  1. 统计每名的语文分数

aggregate([{$match:{sex:'m'}},{$project:{_id:0,name:1,'score.chinese':1}}])

  1. 将所有女生按照英语成绩降序排序

aggregate([{$match:{sex:'w'}},{$sort:{'score.englisth':-1}}])

     

 

固定集合

意义

mongodb中可以创建大小固定的集合,称之为固定集合

 

特点

1、插入速度快,顺序查找速度快

2、能够淘汰早期数据

3、可以控制集合大小

使用

临时缓存

日志处理

 

方法

db.createcollection(collection,{capped:true,size:10000,max:1000})

 

capped: true    表示创建固定集合

size:  表示集合的大小  bytes   4.0 4096

max: 表示最多存放多少文档

 

例子:创建集合为10 存放3条文档

> db.createCollection('log',{capped:true,size:1000,max:3})

插入 3条数据

> db.log.insert({login:'No.1',date:Date()})

* 当插入第四条文档后最前面的一条就会被挤掉

 

 

文件存储

 

 

 

文件存储到数据库方式

  1. 存储路径

将文件在本地的路径以字符串形式存储到数据库

优点: 节省数据库空间

缺点:当数据库或者文件位置发生变化时文件丢失

 

  1. 存储文件本身

以二进制方式将文件存储到数据库

优点: 数据库和文件绑定存在

缺点: 占用空间大,结构化麻烦

 

Mongdb

存储二进制文件

  1. GridFS 方式存储大文件    (> 16M为大文件)

GridFS 方案解释:

      1 在mongdb中一个数据库创建两个集合共同完成对文件的存储

      2 fs.files 用来存储文件的相关信息,为每一个文件创建一个文档,文件名文件类型等信息

      3 fs.chunks 用来分块存储文件的实际内容

     

如何存储:

mongofiles  -d   dbname  put   file

                 数据库      要存储的文件

  1. 如果数据库不存在则自动创建

fs.files

{ "_id" : ObjectId("5b569b8969d72e103282f608"), "chunkSize" : 261120, "uploadDate" : ISODate("2018-07-24T03:22:54.259Z"), "length" : 247759369, "md5" : "a94853f4f64b3e87bf98aea770855615", "filename" : "abc.mp4" }

 

  1. 文件的id ,创建时间,文件大小,文件名称

 

fs.chunks

{ "_id" : ObjectId("5b569b8969d72e103282f61d"), "files_id" : ObjectId("5b569b8969d72e103282f608"), "n" : 20, "data" : BinData(0,"7Pa7M7M9nZt2bezsz272vbdm/7fhu672fwAAbZKbmR2S7Ndv/.....")}

 

  1. 对于同一个文件fs.files中的_id 值等于 fs.chunks中的files_id值

 

文件提取方法

mongofiles  -d  dbname  get   file

                 数据库      要提取的文件

Grid的优缺点

优点: 存储方便,提供较好的命令支持

缺点: 读写效率低

  1. 将文件转为二进制,进行插入 Binaty data

 

游标

 通过一定的操作获取返回结果的对象

 

Var   cursor = db.class1.find()

cursor.hasNext() 判断是否有next

cursor.next  获取下一条数据

python操作mongodb

 

pymongo模块  第三方模块

 

安装: sudo pip3 install pymongo