MongoDB(芒果数据库)
数据存储阶段 |
文件管理阶段(.txt .doc .xls) |
|||
数据库管理阶段 | ||||
文件管理阶段 (.txt .doc .xls) |
优点 |
1、使用简单方便 2、数据能够长期保存 3、可以存储大量数据 |
||
缺点 |
1、数据一致性差 2、数据的查找修改不方便 3、数据冗余(大量重复的数据) |
|||
数据库管理阶段 |
优点 |
1、数据组织结构化,降低冗余 2、提高增删改查效率 3、方便扩展 4、方便程序调用,做自动化的处理 |
||
缺点 |
1、数据库使用特定的语句操作,相对复杂 |
|||
数据 |
能够输入到计算机中并被识别处理的信息的集合 |
|||
数据结构 |
研究一个数据集合中,数据之间关系的学科 |
|||
数据库 |
按照数据结构存储数据的仓库。 在数据库管理系统管理下一定介质上的数据集合。 |
|||
数据库管理系统 |
管理数据库的软件,用于建立维护数据库 |
|||
数据库系统 |
由数据库的数据库管理系统等开发工具组成的集合 |
|||
!关系数据库 |
采用关系模型来组织数据结构的数据库(二维表) |
|||
比如:oracle(甲骨文) DB2 SQLServer(微软) Mysql sqlite(嵌入式) | ||||
优点 |
4、技术成熟,可以使用外部关联复杂操作 |
|||
缺点 |
1、 每次都需要sql语句的解析,消耗大 2、 不能很好的满足并发需求,特别是海量数据爆发,读写能力不足 3、 关系型数据库每一步都要加锁, 以保证操作的原子性,增加了数据库负担 4、 数据的一致性有时会导致空间浪费 |
|||
!非关系数据库 |
(Nosql ----à not noly sql) |
|||
优点 |
|
|||
缺点 |
|
|||
Nosql使用情况 |
|
|||
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
|
手动安装
www.mongdb.com --- > get mongodb --- > community server 选择想要下载的版本
tar 解压后得到 MongoDB 文件夹
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数据库
当这个数据库不存在时会自动创建
而是在实际写入数据时才会创建 | ||
查看当前系统中数据库 |
show dbs |
|
系统数据库 |
存放用户及其权限 admin 存储本地数据 local 存储分片信息 config |
|
数据库的命名规则 |
|
|
db |
mongodb系统全局变量,代表当前使用的数据库
此时插入数据则创建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
|
|
集合命名规则 |
|
|
删除集合 |
db.collectionName.drop()
例子: 删除class db.class.drop()
|
|
集合的重命名 |
db.collenctonName.renameCollection(“new_name”)
例子 db.class2.renameCollection("class0") |
|
文档 |
Mongodb中数据的组织形式 -- > 文档 www.mongodb.com -- > docs 查找文档帮助 |
|
Mongodb文件 |
以键值对形式组成的类似字典的数据描述形式
|
|
键的命名规则 |
|
|
值 |
即文档存储的数据 支持bson 数据 JavaScript ----- > 编程语言 前端 | json 前端和后端的传输格式 | bson
|
|
类型 |
值 |
|
整型 整数 布尔类型 true false 浮点型 小数 Array 数组 Timestamp 时间戳 Date 时间日期 Object 内部文档 Null 空值 null String 字符串 Symbol 特殊字符串 Binary data 二进制字符 code 代码 regex 正则表达式 objeId objeId 子串
{ "_id" : ObjectId("5b504b6f25a94135d37fdf6c") _id : 当在mongo 代表中插入文档时,如果不指定_id则会自动添加这个域,作为键。
ObjectID 值是系统自动生成的不重复子串标识
24位 前8位 文档创建时间 6位 机器ID 4位 进程ID 6位 计数器 | ||
集合中的文档 |
|
|
集合设计 |
|
|
获取集合对象 |
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'})
但是仍然不可重复
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}])
| ||
查看操作 |
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})
例子 > 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})
| |
$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})
| |
$ 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})
|
$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({}) |
练习:
- 创建数据库名字叫 grade
use geage
- 数据库中创建集合 class
3、集合中插入文档,格式如下
{name:’zhang’,age:10,sex:’m’,hobby:[‘a’,’b’]}
age 范围 4-15
hobby (爱好)
范围[draw dance sing pingpang basketball football running computer]
- 查找练习
查看班级所有人信息
*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)
- 删除所有年龄大于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)
|
$inc |
加减修改器 例子:把所有人的年龄都加2 db.class2.update({},{$inc:{age:2}},false,true) 例子:将姓名为Tom的年龄减少0.7 > db.class2.update({name:"Tom"},{$inc:{age:-0.7}})
|
$mul |
乘法修改器 例子:将姓名为Tom的年龄乘以2 > db.class2.update({name:"Tom"},{$mul:{age: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}}})
|
$sort |
对数组进行排序 例子:对姓名为小红,在成绩中进程排序(升序,降序) > db.class3.update({name:'小红'},{$push:{score:{$each:[],$sort:1}}}) > db.class3.update({name:'小红'},{$push:{score:{$each:[],$sort:-1}}})
|
$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 内部文档
意义 |
文档内某个域的值还是一个文档,咋这个文档为内部文档
|
数组下标应用 |
例子:查找book2文档中域为title‘pythonWEB’ > db.class4.find({'book2.title':'pythonWEB'},{_id:0})
例子:查找修改bookl文档中域为price‘38.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 数据库
- 将小红年龄修改为8岁,兴趣爱好变为跳舞画画
{$set:{age:8,hobby:[‘fraw’,’dance’]}}
- 追加小明兴趣爱好 唱歌
{$push:{hobby:’sing’}}
- 追加小王兴趣爱好,吹牛,打篮球
{$pushAll:{hobby:[‘chuiniu’,’basktball’]}}
- 小李兴趣多了跑步唱歌,但是要确保和之前的不重复
{$addToSet:{hobby:{4each;[‘running’,’sing’]}}}
- 班级所有人年龄加1
{$sinc:{age}},false,true
- 删除小明的sex 属性
{$unset:{sex:’’}}
- 删除小李的第一个爱好
{$pop:{hobby:-1}}
- 删除小红的兴趣画画和唱歌
{$pullAll:{hobby:[‘draw’,’sing’]}}
索引
意义 |
指建立指定键值对及所在文档中存储位置的对照清单 使用索引可以方便我们快速查找,减少遍历次数,提高查找效率 |
ensuteIndex() |
功能:创建索引 参数:索引域,索引类别和选项
例子:根据name 创建索引 > db.class1.ensureIndex({name:1})
* 1表示正序,-1逆序
|
getIndexes() |
功能: 查看集合中的索引
例子: > db.class1.getIndexes()
|
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()
|
索引类型
复合索引 |
根据多个域创建一个索引 例子: > db.class1.ensureIndex({name:1,age:-1})
|
数组和 子文档索引 |
如果对某个域创建索引,值为数组或者子文档,则通常数组或子文档进行查找时也是索引查找
|
覆盖索引 |
查找返回的内容,仅仅是索引表存储的内容,不需要再去原数据库查找 |
唯一索引 |
创建索引时希望集合中创建索引的域的值均不重复 例子: > db.class1.ensureIndex({name:1},{unique:true})
|
稀疏索引 (间隙索引) |
只针对有指定域的文档创建索引表 如果某个文档没有改域则不做索引处理
例子:创建age 域的稀疏索引 > db.class1.ensureIndex({age:1},{sparse:true})
|
索引约束 |
|
聚合操作
意义 |
对文档的更高级的筛选整理统计 |
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 |
功能:用于修改文档的显示效果 例子:聚合显示除了id和sex的文档内容 > 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}
aggregate({$group:{_id:'$sex',num:{$sum:1}}})
aggregate([{$match:{sex:'m'}},{$project:{_id:0,name:1,'score.chinese':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()}) * 当插入第四条文档后最前面的一条就会被挤掉 |
文件存储
文件存储到数据库方式 |
将文件在本地的路径以字符串形式存储到数据库 优点: 节省数据库空间 缺点:当数据库或者文件位置发生变化时文件丢失
|
以二进制方式将文件存储到数据库 优点: 数据库和文件绑定存在 缺点: 占用空间大,结构化麻烦
| |
Mongdb 存储二进制文件 |
GridFS 方案解释: 1 在mongdb中一个数据库创建两个集合共同完成对文件的存储 2 fs.files 用来存储文件的相关信息,为每一个文件创建一个文档,文件名文件类型等信息 3 fs.chunks 用来分块存储文件的实际内容
如何存储: mongofiles -d dbname put file 数据库 要存储的文件
fs.files { "_id" : ObjectId("5b569b8969d72e103282f608"), "chunkSize" : 261120, "uploadDate" : ISODate("2018-07-24T03:22:54.259Z"), "length" : 247759369, "md5" : "a94853f4f64b3e87bf98aea770855615", "filename" : "abc.mp4" }
fs.chunks { "_id" : ObjectId("5b569b8969d72e103282f61d"), "files_id" : ObjectId("5b569b8969d72e103282f608"), "n" : 20, "data" : BinData(0,"7Pa7M7M9nZt2bezsz272vbdm/7fhu672fwAAbZKbmR2S7Ndv/.....")}
文件提取方法 mongofiles -d dbname get file 数据库 要提取的文件 Grid的优缺点 优点: 存储方便,提供较好的命令支持 缺点: 读写效率低 |
|
游标
通过一定的操作获取返回结果的对象
Var cursor = db.class1.find()
cursor.hasNext() 判断是否有next
cursor.next 获取下一条数据
python操作mongodb
pymongo模块 第三方模块
安装: sudo pip3 install pymongo