MongoDB day03
修改操作符
$set 修改一个域,或者增加一个域
e.g. 修改功能,如果该域不存在则增加这个域 db.class0.update({age:20},{$set:{name:'小微'}})
$unuset 删除一个域
e.g. sex后面为空表示删除一个域 db.class0.update({name:'Jame'},{$unset:{sex:''}})
$rename 修改一个域的名字
e.g. 将sex域名修改为gender db.class.update({},{$rename:{sex:'gender'}},false,ture)
$setOnInsert 如果update执行了插入文档操作,表示补充插入的内容
e.g. 如果执行插入操作则将setOnInsert中内容也插入 db.class0.update({name:'Tom'},{$set:{age:17},$setOnInsert:{gender:'m',tel:'12345'}},true)
* 在update参数中可以同时写多个修改器
&inc 加减修改器
e.g. 所有人年龄增加1 db.class0.update({},{$inc:{age:1}},false,true)
* $inc值可以是* 正数负数整数小数
&mul 乘法修改器
e.g. Tom年龄 乘以2 db.class0.update({name:'Tom'},{$mul:{age:2}})
* $mul值可以是正数负数整数小数
&max 指定了某个域值的下限,如果小于指定值则修改为指定值
e.g. 将年龄不到20的修改为20 db.class0.update({},{$max:{age:20}},false,true)
&min 指定了某个域值的上限,如果大于指定值则修改为指定值
e.g. 年龄大于25的修改为25 db.class0.update({},{$min:{age:25}},false,true)
数组修改器
$push 向数组中添加一项
e.g. db.class3.update({name:'小明'},{$push:{score:5}})
$pushAll 向数组中添加多项
e.g. db.class3.update({name:'小红'},{$pushAll:{score:[5,10]}})
$pull 从数组中删除一项
e.g. db.class3.update({name:'小红'},{$pull:{score:10}})
*数组可以有重复值,如果删除则会把所有指定的值都删除
$pullAll 删除数组中多项
e.g. db.class3.update({name:'小明'},{$pullAll:{score:[67,5]}})
$each 对多个值逐一操作
e.g. db.class3.update({name:'小明'},{$push:{score:{$each:[5,10]}}})
$position 指定插入位置
e.g. 需要搭配$each使用,将数据从1号位置插入db.class3.update({name:'小红'},{$push:{score:{$each:[10],$position:1}}})
$sort 对数组进行排序
e.g. 和each一起使用,对数组score进行排序db.class3.update({name:'小红'},{$push:{score:{$each:[],$sort:1}}})
$pop 弹出一项
e.g. 1表示弹出最后一项 -1表示删除第一项 db.class3.update({name:'小红'},{$pop:{score:-1}})
$addToSet 向数组中添加一项,不能和已有的内容重复
e.g. 添加87,不能和已有数据重复db.class3.update({name:'小红'},{$addToSet:{score:87}})
时间类型
mongodb中存储时间格式 : ISODate()
方法1 : new Date() 自动生成当前时间、和北京时间相差8个小时
e.g. db.class2.insert({title:'Python入门',date:new Date()})
方法2 : ISODate() 生成当前时间、和北京时间相差8个小时
e.g. db.class2.insert({title:'Python精通',date:ISODate()})
方法3 Date() 将计算机时间生成的时间格式变为字符串存储
e.g. db.class2.insert({title:'Python疯狂',date:Date()})
ISODate()
功能 : 生成mongodb时间存储类型
参数 : 不加参数生成的是当前时间;指定时间格式可以是: "2018-07-01 12:10:56" "20180701 12:10:56" "20180701"
e.g. db.class2.insert({title:'Python崩溃',date:ISODate("2018-07-01 01:12:12")})
时间戳
通过当前的时间生成的一个时间节点标记
valueOf() 将时间转换为时间戳(计算机元年的时间)
e.g. db.class2.insert({title:'Python放生',date:ISODate().valueOf()})
Null类型 :null
1. 如果某个域存在却没有值,可以设置为null
e.g. db.class2.insert({title:'Python涅槃',price:null})
2. 在查找时可以找到值为null或者不存在的文档
e.g. 找到date域不存在的文档db.class2.find({date:null},{_id:0})
Object 内部文档
文档内某个域的值还是一个文档,则这个文档为内部文档
* 当需要使用内部文档某个域的时候,可以使用外部文档 . 的方法引用内部文档。但是注意此时需要加引号
e.g.db.class4.find({'book2.title':'python Web'},{_id:0})
e.g. db.class4.update({'book1.title':'python爬虫'},{$set:{'book1.price':48.8}})
数组的下标操作方式
* 使用数组时,可以通过 域名.下标 的方式,具体操作数组的某一项,注意:必须加上引号
e.g. db.class3.find({'score.0':98},{_id:0})
e.g. db.class3.update({name:'小明'},{$set:{'score.0':100}})
查找结果的有序性
即可以对find的查找结果使用[]的方式引用具体某一条
e.g. db.class1.find({},{_id:0})[1]
练习 :使用之前的grade数据库
1. 将小红年龄修改为8岁,兴趣爱好变为跳舞画画{$set:{age:8,hobby:[‘draw’,'dance']}}
2. 追加小明兴趣爱好 唱歌{$push:{hobby:'sing'}}
3. 追加小王兴趣爱好,吹牛,打篮球{$pushAll:{hobby:['chuiniu','basketball']}}
4. 小李兴趣多了跑步唱歌,但是要确保和之前的不重复{$addToSet:{hobby:{$each:['running','sing']}}}
5. 班级所有人年龄加1{$inc:{age:1}},false,true
6. 删除小明的sex属性{$unset:{sex:''}}
7. 删除小李的第一个爱好 {$pop:{hobby:-1}}
8. 删除小红的兴趣画画和唱歌{$pullAll:{hobby:['draw','sing']}}
9、为小红添加一个域,为score:{english:93,chinese:92,mathch:78} {$set:{score:{english:93,chinese:92,mathch:78}}}
10、给小明的的数学成绩加5分 {$inc:{'score.math':5}}
11、小明的第一爱好改为computer {$set:{'hobby'.o:'computer'}}
索引
指建立指定键值对及所在文档中存储位置的对照清单。使用索引可以方便我们快速查找,减少遍历次数,提高查找效率。
ensureIndex() mongodb创建索引
功能 : 创建索引
参数 : 第一个为对哪个域创建索引;第二个为索引的选项
e.g. 根据name 创建索引db.class1.ensureIndex({name:1})
* 1表示正向索引 -1表示逆向索引
db.class1.getIndexes() 查看一个集合中的索引
* _id是系统自动创建的索引
自定义索引名称:通过第二个参数传入索引选项实现 db.class1.ensureIndex({name:1},{name:'name_index'})
* 同一个域不能重复创建索引,一个集合中的索引名也不能相同
dropIndex() 删除索引
功能 : 删除索引
参数 : 要删除的索引,可以是索引名称或者索引键值对
e.g. db.class1.dropIndex('age_index')
e.g. db.class1.dropIndex({name:-1})
dropIndexes() 删除所有索引 除了_id
e.g. db.class1.dropIndexes()
索引类型
复合索引:根据多个域创建一个索引
e.g. db.class1.ensureIndex({name:1,age:-1})根据name和age域查询都为索引查询,比单独创建两个索引表更节省空间
数组和子文档索引
如果对某个数组和子文档域创建索引,则通过数组或子文档进行查找时也是索引查找
e.g. 如果对score域创建索引则下面的查找也是索引查找 db.class.find({'score.0':60},{_id:0})
覆盖索引
查找操作需要获取的域,只有索引域没有娶她域。此时索引表可以直接提供给用户想要的内容,不需要再去原数据库查找,提高索引效率
唯一索引
创建索引,创建索引的域的值均不重复,此时可以创建唯一索引
e.g. db.class1.ensureIndex({name:1},{unique:true})
* 当对某一域创建唯一索引,该域就不能再插入重复数据
稀疏索引(间隙索引)
只针对有指定域的文档创建索引表,如果某个文档没有该域则不做索引处理
e.g. 创建age域的稀疏索引db.class1.ensureIndex({age:1},{sparse:true})
索引约束
1. 当数据发生更新 ,索引也要随之更新。影响插入,修改,删除操作的效率
2. 索引表也需要占有一定的磁盘空间
综上 :当数据量比较大时或频繁进行查找操作而不是更新插入操作更加适合创建索引;当数据量比较小,或者需要频繁的进行数据修改、插入操作而不是查找操作的时候,不适合创建索引
固定集合
指的是在mongodb中可以创建大小固定的集合,称之为固定集合。
特点:插入速度更快,顺序查找更快,可以控制集合的空间大小,能够自动淘汰早期数据,
使用:日志系统;临时缓存;
创建:db.createCollection(collection,{capped:ture,size:10000,max:1000})
capped:ture 创建固定集合
size:10000 固定集合的大小 字节数
max:1000 表示最多1000条文档
db.createCollertion('log',{capped:ture,size:10000,max:3})
聚合操作
对文档的更高级的筛选整理统计
db.collection.aggregate()
功能 : 聚合函数,完成聚合操作
参数 : 聚合条件 ---》 聚合操作符
返回:统计后的文档集合
聚合操作符
$group 分组聚合需要配合分组统计操作符使用
$sum : 求和分组按sex内容分组
e.g. db.class1.aggregate({$group:{_id:'$sex',{$sum:1}}})
num: 自定义统计域统计
e.g. 统计所有男生和女生的年龄之和 db.class1.aggregate({$group:{_id:'$sex',num:{$sum:'$age'}}})
分组:按照sex值统计,统计结果,求和 每有一个加一
$avg 求平均
e.g. 求每个性别的平均年龄db.class1.aggregate({$group:{_id:'$sex',num:{$avg:'$age'}}})
$max 求最大值
e.g. 求每组年龄的最大值db.class1.aggregate({$group:{_id:'$sex',max:{$max:'$age'}}})
$min 求最小值
e.g. 求每组年龄的最小值db.class1.aggregate({$group:{_id:'$sex',min:{$min:'$age'}}})
$project 用于修改文档的显示效果
e.g. db.class1.aggregate({$project:{_id:0,sex:0}})
e.g. 指定显示域名db.class1.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})
$match 过滤数据
e.g. 过滤年龄大于16的db.class1.aggregate({$match:{age:{$gt:16}}})
$limit 显示前几条文档
e.g. 获取数据的前两个文档 db.class1.aggregate({$limit:2})
$skip 跳过几条文档
e.g. 跳过前两条文档显示后面内容 db.class1.aggregate({$skip:2})
$sort 排序
e.g. 按年龄升序排序 db.class1.aggregate({$sort:{age:1}})
聚合管道 : 将前一个聚合操作得到的结果,给后一个聚合操作继续使用
db.collection.aggregate([聚合1,聚合2....])
e.g. $match ---> $project ---> $sort
db.class1.aggregate([{$match:{sex:'m'}},{$project:{_id:0}},{$sort:{age:1}}])
$group ---> $match
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}}})
2. 统计每名男生的语文分数
aggregate([{$match:{sex:'m'}},{$project:{_id:0,name:1,'score.chinese':1}}])
3. 将所有女生按照英语成绩降序排序
aggregate([{$match:{sex:'w'}},{$sort:{'score.englisth':-1}}])
4、统计所有男生的语文成绩,只有打印姓名,性别,语文成绩即可
aggregate({$match:{sex:'w'}},{$sort:{'score.eng'}})
MongoDB day03的更多相关文章
- 【翻译】MongoDB指南/聚合——聚合管道
[原文地址]https://docs.mongodb.com/manual/ 聚合 聚合操作处理数据记录并返回计算后的结果.聚合操作将多个文档分组,并能对已分组的数据执行一系列操作而返回单一结果.Mo ...
- 【翻译】MongoDB指南/CRUD操作(四)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...
- 【翻译】MongoDB指南/CRUD操作(三)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...
- 【翻译】MongoDB指南/CRUD操作(二)
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...
- 【翻译】MongoDB指南/CRUD操作(一)
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删 ...
- CRL快速开发框架系列教程十二(MongoDB支持)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- MongoDB系列(二):C#应用
前言 上一篇文章<MongoDB系列(一):简介及安装>已经介绍了MongoDB以及其在window环境下的安装,这篇文章主要讲讲如何用C#来与MongoDB进行通讯.再次强调一下,我使用 ...
- MongoDB系列(一):简介及安装
什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为应用提供可扩展的高 ...
- [原]分享一下我和MongoDB与Redis那些事
缘起:来自于我在近期一个项目上遇到的问题,在Segmentfault上发表了提问 知识背景: 对不是很熟悉MongoDB和Redis的同学做一下介绍. 1.MongoDB数组查询:MongoDB自带L ...
随机推荐
- linux配置PHP环境!!(云服务器架设)
首先去阿里云或腾讯云购买主机(腾讯云现在有免费30天的云主机...) 购买好之后选择安装: 点登陆 就可以到linux的操作界面了 进入操作界面 输入root账号密码取得权限之后就可以开始配置环境了 ...
- 【OpenCV入门教程之二】 一览众山小:OpenCV 2.4.8 or OpenCV 2.4.9组件结构全解析
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/19925819 作者:毛星云 ...
- (二) ffmpeg filter学习--混音实现
Audio 混音实现 从FFMPEG原生代码doc/examples/filtering_audio.c修改而来. ffmpeg版本信息 ffmpeg version N-82997-g557c0df ...
- Vim技能修炼教程(10) - 代码跳转
程序员功能 前面我们用了5讲的篇幅来讲基本编辑的基本功:第4讲是基本操作,第5讲是操作符,第6讲行编辑ex命令,第7讲可视模式,第8讲多窗口,第9讲缓冲区和标签页. 从这一讲开始,我们从通用功能向程序 ...
- [Github] 本地git push免用户名和密码的配置
在终端通过git config --global命令进行配置 git config --global user.email "xxx@xxmail.com" git config ...
- python文件写中的f.flush()方法
f = open("input.txt", "w") f.write("aaaaaa") f.flush() #强行把缓冲区中的内容放到磁盘 ...
- [转]Java 8新特性探究(lambda)
原文地址:http://my.oschina.net/benhaile/blog/175012 目录[-] 函数式接口 Lambda语法 方法引用 总结 函数式接口 函数式接口(functional ...
- ueditor编辑器【实际项目使用】
[页面效果] [代码] 说明: ueditor插件的公共代码: 如果是一个可以放在对应模块的js代码中 如果有多个就要提到全局的高度(即提到公共部分) <script type=" ...
- Uoj 129 寿司晚宴
Uoj 129 寿司晚宴 显然合法性只与每个数所含的质因子有关,考虑状压 \(dp\) 若记录所有质因子状态显然爆炸,注意到每个数最多有一个超过 \(\sqrt 500\) 的大质因子,而其他的小质因 ...
- POJ3068 "Shortest" pair of paths 【费用流】
POJ3068 "Shortest" pair of paths Description A chemical company has an unusual shortest pa ...