目录
day03
修改操作符的使用
- 在update参数可以同时写多个修改器
操作符 | 含义 | 例子 |
---|---|---|
$set | 修改一个域的值,或者增加一个域 | 修改功能 如果该域不存在则增加这个域: db.class2.update({name:'小刚'},{$set:{age:30}}) |
$unset | 删除一个域 | sex后面为空表示删除一个域:
|
说明 | 每个操作符可以同时操作多项 | 把小陈的年龄改成36,添加性别 db.class0.update({name:'小陈'},{$set:{age:36,sex:'m'}}) 一次修改可以同时使用多个操作符, e.g.:把阿宝改成老王,并把性别删除 db.class0.update({name:'阿宝'},{$set:{name:'老王'},$unset:{sex:' '}}) |
$rename | 修改一个域的名称 | 将sex域名修改为gender:
|
$setOnInsert | 如果update执行了插入文档操作,表示补充插入内容 | 如果执行插入操作则将setOnInsert中内容也插入:
|
$inc | 加减修改器 | 所有人年龄增加1:
注意: |
$mul | 乘法修改器 | Tom年龄乘以2:
注意:* |
$max | 指定了某个域值的下限,如果小于指定值则修改为指定值 | 将年龄不到30的修改为30:db.class0.update({},{$max:{age:20}},false,true) |
$min | 如果筛选文档指定域的值小于min值则不修改,大于min值则修改 | 年龄大于18的修改为18: db.class2.update({},{$min:{age:18}},false,true) |
数组修改器
操作符 | 含义 | 例子 |
---|---|---|
$push | 向数组中添加一项 | db.class2.update({name:'小亮'},{$push:{score:91}}) |
$pushAll | 向数组中添加多项 | db.class2.update({name:'小红'},{$pushAll:{score:[5,10]}}) |
$pull | 从数组中删除一项 |
注意:数组可以有重复值,如果删除则会把所有指定的值都删除 |
$pullAll | 删除数组中多项 | db.class3.update({name:'小明'},{$pullAll:{score:[67,5]}}) |
$each | 对多个值逐一操作 | db.class3.update({name:'小明'},{$push:{score:{$each:[5,10]}}}) |
$position | 指定插入位置 | 需要搭配$each使用,将数据从1号位置插入:
|
$sort | 对数组进行排序1是升序, -1是降序 | each一起使用,对数组score进行排序:db.class3.update({name:'小红'},{$push:{score:{$each:[],$sort:1}}}) |
$pop | 弹出一项 | 1表示弹出最后一项 -1表示删除第一项 :
|
$addToSet | 向数组中添加一项,不能和已有的内容重复 | 添加87,没有87则添加87:
|
时间类型
mongodb 中支持时间格式 : ISODate()
- 方法1 : new Date() 自动生成当前时间
e.g. :
db.class2.insert({book:'Python入门',date:new Date()}) -
方法2 : ISODate() 生成当前时间
e.g.
db.class2.insert({book:'Python精通',date:ISODate()}) -
方法3 Date() 将生成的当前时间变为字符串存储
e.g.
db.class2.insert({book:'Python疯狂',date:Date()}) -
指定时间:
ISODate()- 功能 : 生成mongodb时间存储类型
- 参数 :
不加参数生成当前时间
指定时间参数格式
“2018-07-01 12:10:56”
“20180701 12:10:56”
“20180701” - e.g.
db.class2.insert({book:'python崩溃',date:ISODate('2018-07-13 11:23:36')})
> db.class2.find({},{_id:0})
> db.class2.insert({book:'Python入门',date:new Date()})
WriteResult({ "nInserted" : 1 })
> db.class2.insert({book:'Python精通',date:ISODate()})
WriteResult({ "nInserted" : 1 })
> db.class2.insert({book:'Python疯狂',date:Date()})
WriteResult({ "nInserted" : 1 })
> db.class2.insert({book:'python崩溃',date:ISODate('2018-07-13 11:23:36')})
> db.class2.insert({book:'Python放生',date:ISODate().valueOf()})
WriteResult({ "nInserted" : 1 })
> db.class2.find({},{_id:0})
{ "book" : "Python入门", "date" : ISODate("2018-08-21T04:29:55.294Z") }
{ "book" : "Python精通", "date" : ISODate("2018-08-21T04:30:02.082Z") }
{ "book" : "Python疯狂", "date" : "Tue Aug 21 2018 12:30:09 GMT+0800 (CST)" }
{ "book" : "python崩溃", "date" : ISODate("2018-07-13T11:23:36Z") }
{ "book" : "Python放生", "date" : 1534831682648 }
时间戳
通过当前的时间生成的一个时间节点标识
- valueOf()
生成某个标准时间的时间戳 - e.g.:
db.class2.insert({title:'Python放生',date:ISODate().valueOf()})
Null 类型
- 值:null
- 如果某个域存在却没有值可以设置为null
e.g.:表示date没有实际意义的值
db.class2.insert({book:'Python涅槃',date:null}) - 在查找时可以找到值为null或者不存在某个域的文档
db.class2.find({date:null},{_id:0})
数组的下标操作方式
可以通过域名 . 下标 的方式具体操作数据的某一项
- e.g.查找数据0项大于90的文档
db.class2.find({'score.0':{$gt:90}},{_id:0}) - e.g.
将score第1项改为10db.class2.update({name:'小红'},{$set:{'score.1':10}})
object 内部文档操作
- 文档内部某个域的值还是一个文档,则这个文档称为内部文档类型数据
- 通过 外部域 . 内部文档域 的方式引用内部文档中某个域的值进行操作
e.g.:
db.class3.find({'books.title':'狂人日记'},{_id:0})
e.g.:
db.class3.update({'books.title':'骆驼祥子'},{%set:{'books.price':48.6}})
查找结果的下标引用
- 可以通过下标的方式获取查找结果的某一项
- e.g.:获取查找结果的第二项
db.class2.find({},{_id:0})[2]
练习:
使用之前的grade数据库
- 将小红年龄改为8岁,兴趣爱好变为跳舞画画
db.class1.update({name:'小红'},{$set:{age:8,hobby:['dance','draw']}}) - 追加小明兴趣爱好 唱歌
db.class1.update({name:'小明'},{$push:{hobby:'sing'}}) - 追加小王兴趣爱好,吹牛,打篮球
db.class1.update({name:'小王'},{$pushAll:{hobby:['brag','basketball']}}) - 小李兴趣多了跑步唱歌,但是要确保不和以前的重复
db.class1.update({name:'小李'},{$addToSet:{hobby:{$each:['running','sing']}}}) - 将该班所有的同学年龄加1
db.class1.update({},{$inc:{age:1}},false,true) - 删除小明的sex属性
db.class1.update({name:'小明'},{$unset:{sex:''}}) - 删除小李兴趣中第一项
db.class1.update({name:'小李'},{$pop:{hobby:-1}}) - 删除小红兴趣中的画画和唱歌
db.class1.update({name:'小红'},{$pullAll:{hobby:['draw','sing']}}) - 为小红增加一个域,为score:{english:93,chinese:92,match:78}
db.class1.update({name:'小红'},{score:{english:93,chinese:92,match:78}}) - 给小红数学成绩加5分
db.class1.update({name:'小红'},{$inc:{'score.math':5}}) - 小明的第一爱好改为computer
db.class1.update({name:'小明'},{$set:{'hobby.0':'computer'}})
索引
- 索引:指建立指定键值及所在文档中存储位置的对照清单,使用索引可以方便我们进行快速查找,减少数据遍历次数,从而提高查找效率
- Mongodb创建索引
- ensureIndex()
功能:创建索引
参数:
第一个为对哪个域创建索引
第二个为索引的选项 - e.g.对name域创建索引
db.class1.ensureIndex({name:1})
注意:1表示正向索引,-1表示逆向索引
- ensureIndex()
- 查看某个集合中的索引
db.class1.getIndexes()
注意:_id是系统自动创建的索引 - 自定义索引名称
- 通过第二个参数传入索引选项实现
- e.g.:db.class1.ensureIndex({age:1},{name:'ageIndex'})
- 同一个域不能重复创建相同的索引,一个集合中索引名也不要相同
-
删除索引
dropIndex()
功能:删除一个索引
参数:索引名或者索引键值对
e.g.db.class1.dropIndex('ageIndex')
e.g.db.class1.dropIndex({name:-1})
- dropIndexes()
删除所有索引,除了_id
e.g.:db.class1.dropIndexes()
其它索引类型
- 复合索引
- 同时根据多个域创建一个索引
- e.g.:根据name和age域查询都为索引查询,比单独创建两个索引表更节省时间
db.class1.ensureIndex({name:1,age:-1})
- 数组和子文档索引
如果对某个数组和子文档域创建索引,那么根据数组或子文档的进行查找时也是索引查找
e.g.如果对score域创建索引则下面的查找也是索引查找
db.class2.find({'score.0':60},{_id:0}) - 覆盖索引
查找操作需要获取的域,只有索引域没有其他域,此时索引表可以直接提供给用户想要的内容,提高查找效率
db.class1.find({name:'小白'},{_id:0,name:1,age:1}) - 唯一索引
- 创建的索引,索引域值无重复,此时可以创建唯一索引,唯一索引数据结构更加便于查找
- e.g.对name创建唯一索引,name的值不能有重复
db.class1.ensureIndex({name:1},{unique:true}) - 当对某个域创建唯一索引,该域就不能再插入重复数据
- 稀疏索引(间隙索引)
- 只针对有指定域的文档创建索引表,如果某个文档没有该域不会插入到索引表中
- e.g.对age创建稀疏索引
db.class1.ensureIndex({age:1},{sparse:true})
索引约束
- 索引表也需要占用一定的磁盘空间
- 当数据发生更新时索引表也要随之更新
- 综上:数据比较大时更适合创建索引,数据量较小时没有必要付出索引代价,
频繁进行查找操作而不是更新删除插入操作,此时更适合使用索引
固定集合
mongodb中可以创建大小固定的集合,称之为固定集合
- 特点:
插入速度更快,顺序查找更快
可以控制集合的空间大小
能够自动淘汰早期数据 - 使用:
日志处理
临时缓存 - 创建
db.createCollection(collection,{capped:true,size:10000,max:1000})
capped:true 创建固定集合
size:10000 固定集合的大小,字节数
max: 1000 表示最多多少条文档 - e.g.:创建一个固定几个
db.createCollection(collection,{capped:true,size:10000,max:1000})
> db.createCollection('log',{capped:true,size:10000,max:3})
{ "ok" : 1 }
> db.log.insert({logconfig:001,date:Date()})
WriteResult({ "nInserted" : 1 })
> db.log.insert({logconfig:002,date:Date()})
WriteResult({ "nInserted" : 1 })
> db.log.insert({logconfig:003,date:Date()})
WriteResult({ "nInserted" : 1 })
> db.log.find({},{_id:0})
{ "logconfig" : 1, "date" : "Tue Aug 21 2018 17:47:31 GMT+0800 (CST)" }
{ "logconfig" : 2, "date" : "Tue Aug 21 2018 17:47:43 GMT+0800 (CST)" }
{ "logconfig" : 3, "date" : "Tue Aug 21 2018 17:47:47 GMT+0800 (CST)" }
> db.log.insert({logconfig:004,date:Date()})
WriteResult({ "nInserted" : 1 })
> db.log.find({},{_id:0})
{ "logconfig" : 2, "date" : "Tue Aug 21 2018 17:47:43 GMT+0800 (CST)" }
{ "logconfig" : 3, "date" : "Tue Aug 21 2018 17:47:47 GMT+0800 (CST)" }
{ "logconfig" : 4, "date" : "Tue Aug 21 2018 17:49:18 GMT+0800 (CST)" }
作业:
- 熟练mongodb修改操作
- 熟练索引的创建方法