修改操作符

$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相关推荐

  1. windows安装MongoDB环境以及在pycharm中配置可视化插件

    安装MongoDB数据库 参考这里 安装PyMongo python3 -m pip3 install pymongo指定版本 python3 -m pip3 install pymongo==3.5 ...

  2. SQL与NoSQL的区别 以MySQL与MongoDB为例

    异同对比 1.语言和结构层面 SQL数据库,是基于表的,并且用结构化语言也就是SQL来定义和操纵数据.一方面,这是非常强大的:SQL是最通用和最广泛使用的选项之一,使其成为一个安全的选择,尤其适用于复 ...

  3. php配置mongodb扩展、安装mongodb服务教程

    安装mongodb服务. 1.下载mongodb: mongodb 提供了可用于 32 位和 64 位系统的,你可以从mongodb官网下载安装. mongodb下载地址:https://www.mo ...

  4. MongoDB之conf配置文件详解

    详细看一下mongodb配置文件. mongodb.conf # mongodb.conf# 数据库文件位置 dbpath=/var/lib/mongodb#日志文件的路径 logpath=/var/ ...

  5. CentOS7.4 安装mongodb

    温馨提示:我的环境是腾讯云自带的CentOS7.4 x64 镜像,本地环境是win10 x64 专业版,ssh工具是用的win10 自带的cmd, 远程工具版本是Robo 3T 1.2.1 . 如果环 ...

  6. Centos7下安装MongoDB

    简介 MongoDB 是一个基于分布式 文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 查看官方网站 MongoDB特点 模式自 ...

  7. php mongodb execute,php简单操作mongodb

    您现在的位置是:网站首页>>PHP>>php php简单操作mongodb 发布时间:2019-09-29 16:34:25作者:wangjian浏览量:525点赞量:0 一: ...

  8. 【MongoDB异常】Exception authenticating MongoCredential解决方法

    我们通过ideal编辑器编辑 springboot时候,出现这个错误: com.mongodb.MongoSecurityException: Exception authenticating Mon ...

  9. mongodb插入数据获取本次插入的mongodb id

    最近接了一个别人的项目做二次开发,使用php进行mongodb的数据操作时,需要插入数据后得到相应的mongodb 中的id,简单代码如下 $data = array('test' => 'aa ...

最新文章

  1. 算力觉醒后,智慧距离勃发就只差一个想法
  2. CTFshow 信息收集 web7
  3. AD9910高速集成DDS芯片(verilog篇-串行模式篇-22个寄存器SPI通信周期控制)
  4. 借款人死亡后,贷款必须由家属偿还吗?
  5. Python中numpy读取高维数组中特定的行,列
  6. 微型计算机原理聂伟荣,微型计算机原理与应用 聂伟荣 第十章 串行通信技术 课件.pdf...
  7. php之sprintf的用法,PHP之sprintf函数用法详解
  8. 小米4刷魅族系统后无服务器,小米4线刷魅族Flyme OS系统的教程_小米4 Flyme OS刷机包...
  9. 信息隐藏基础算法——LSB算法(python实现)
  10. facebook登陆按钮_为什么Facebook Like按钮占平均网站代码的16%
  11. Python3爬虫(4)--抓取考生的四六级成绩
  12. 韩天峰php教程,韩天峰 - Swoole4-全新的PHP编程模式
  13. uniapp easycom教程
  14. BLE协议栈学习2——OSAL
  15. 浪潮服务器重置密码方法
  16. 使用source导入MySQL出现“ERROR: Failed to open file xx, error: 2“问题的解决
  17. 【无标题】8421码,5421码,2421码,余三码之间的区别及对数的表示规则
  18. ubuntu18.04交叉编译移植OpenCV4.70和QT5.12.12至ARM64位平台LKD3588(开发板为ubuntu22.04系统)(三)
  19. 【MOOC】数学实验 - 电子科技大学-第1讲
  20. JAVA根据word模板生成合同,并能实现网页在线浏览/打印/下载

热门文章

  1. 人工智能的高层建筑取决于数据基础设施
  2. 安卓手机端口号怎么查看_安卓手机里的专业模式究竟该怎么拍?
  3. Js逆向:建筑市场监管平台
  4. 华为设备接口视图_华为设备的交换机接口类型介绍及配置
  5. 长期宅在家的人都有什么比较好的室内锻炼的方法?
  6. mysql创建数据库后出现Access denied for user 'root'@'%' to database ‘xxxx’
  7. 关于一阶线性电路的零输入响应
  8. TNW:Tumblr博文已超200亿
  9. SocialBoo出海指南 || 海外网红营销深度报告
  10. centos启动卡死进不去界面,停留在started GNOME display manager