MongoDB day03

目录

修改操作符的使用

数组修改器

时间类型

数组的下标操作方式

索引

固定集合


day03

修改操作符的使用

  • 在update参数可以同时写多个修改器
操作符含义例子
$set修改一个域的值,或者增加一个域

修改功能 如果该域不存在则增加这个域:

db.class2.update({name:'小刚'},{$set:{age:30}})

$unset删除一个域

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

db.class0.update({name:'Jame'},{$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:

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

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

如果执行插入操作则将setOnInsert中内容也插入:

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

$inc加减修改器

所有人年龄增加1:

db.class0.update({},{$inc:{age:1}},false,true),

注意:$inc值可以是正数负数整数小数

$mul乘法修改器

Tom年龄乘以2:

db.class0.update({name:'Tom'},{$mul:{age:2}}),

注意:$mul值可以是正数负数整数小数*

$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从数组中删除一项

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

注意:数组可以有重复值,如果删除则会把所有指定的值都删除

$pullAll删除数组中多项db.class3.update({name:'小明'},{$pullAll:{score:[67,5]}})
$each对多个值逐一操作db.class3.update({name:'小明'},{$push:{score:{$each:[5,10]}}})
$position指定插入位置

需要搭配$each使用,将数据从1号位置插入:

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

$sort

对数组进行排序1是升序,

-1是降序

each一起使用,对数组score进行排序:db.class3.update({name:'小红'},{$push:{score:{$each:[],$sort:1}}})
$pop弹出一项

1表示弹出最后一项 -1表示删除第一项 :

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

$addToSet向数组中添加一项,不能和已有的内容重复

添加87,没有87则添加87:

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

时间类型

  mongodb 中支持时间格式 : ISODate()

  1. 方法1 : new Date() 自动生成当前时间 
    e.g. :
    db.class2.insert({book:'Python入门',date:new Date()})
  2. 方法2 : ISODate() 生成当前时间
    e.g.
    db.class2.insert({book:'Python精通',date:ISODate()})

  3. 方法3 Date() 将生成的当前时间变为字符串存储
    e.g.
    db.class2.insert({book:'Python疯狂',date:Date()})

  4. 指定时间:
    ISODate()

    1. 功能 : 生成mongodb时间存储类型
    2. 参数 :
      不加参数生成当前时间
      指定时间参数格式
      “2018-07-01 12:10:56” 
      “20180701 12:10:56” 
      “20180701”
    3. 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
  1. 如果某个域存在却没有值可以设置为null
    e.g.:表示date没有实际意义的值
    db.class2.insert({book:'Python涅槃',date:null})
  2. 在查找时可以找到值为null或者不存在某个域的文档
    db.class2.find({date:null},{_id:0})

数组的下标操作方式

可以通过域名 . 下标 的方式具体操作数据的某一项

  1. e.g.查找数据0项大于90的文档
    db.class2.find({'score.0':{$gt:90}},{_id:0})
  2. 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数据库

  1. 将小红年龄改为8岁,兴趣爱好变为跳舞画画
    db.class1.update({name:'小红'},{$set:{age:8,hobby:['dance','draw']}})
  2. 追加小明兴趣爱好 唱歌
    db.class1.update({name:'小明'},{$push:{hobby:'sing'}})
  3. 追加小王兴趣爱好,吹牛,打篮球
    db.class1.update({name:'小王'},{$pushAll:{hobby:['brag','basketball']}})
  4. 小李兴趣多了跑步唱歌,但是要确保不和以前的重复
    db.class1.update({name:'小李'},{$addToSet:{hobby:{$each:['running','sing']}}})
  5. 将该班所有的同学年龄加1
    db.class1.update({},{$inc:{age:1}},false,true)
  6. 删除小明的sex属性
    db.class1.update({name:'小明'},{$unset:{sex:''}})
  7. 删除小李兴趣中第一项
    db.class1.update({name:'小李'},{$pop:{hobby:-1}})
  8. 删除小红兴趣中的画画和唱歌
    db.class1.update({name:'小红'},{$pullAll:{hobby:['draw','sing']}})
  9. 为小红增加一个域,为score:{english:93,chinese:92,match:78}
    db.class1.update({name:'小红'},{score:{english:93,chinese:92,match:78}})
  10. 给小红数学成绩加5分
    db.class1.update({name:'小红'},{$inc:{'score.math':5}})
  11. 小明的第一爱好改为computer
    db.class1.update({name:'小明'},{$set:{'hobby.0':'computer'}})

索引

  1. 索引:指建立指定键值及所在文档中存储位置的对照清单,使用索引可以方便我们进行快速查找,减少数据遍历次数,从而提高查找效率 
  2. Mongodb创建索引
    1. ensureIndex()
      功能:创建索引
      参数:
      第一个为对哪个域创建索引
      第二个为索引的选项
    2. e.g.对name域创建索引
      db.class1.ensureIndex({name:1})
      注意:1表示正向索引,-1表示逆向索引 ​​​​​​​
  3. 查看某个集合中的索引
    db.class1.getIndexes()
    注意:_id是系统自动创建的索引
  4. 自定义索引名称
    1. 通过第二个参数传入索引选项实现
    2. e.g.:db.class1.ensureIndex({age:1},{name:'ageIndex'})
    3. 同一个域不能重复创建相同的索引,一个集合中索引名也不要相同
  5. 删除索引
    dropIndex()
    功能:删除一个索引
    参数:索引名或者索引键值对
    e.g. db.class1.dropIndex('ageIndex') 
    e.g. db.class1.dropIndex({name:-1})

  6. dropIndexes()
    删除所有索引,除了_id
    e.g.:db.class1.dropIndexes()

其它索引类型

  1. 复合索引
    1. 同时根据多个域创建一个索引
    2. e.g.:根据name和age域查询都为索引查询,比单独创建两个索引表更节省时间
      db.class1.ensureIndex({name:1,age:-1})
  2. 数组和子文档索引
    如果对某个数组和子文档域创建索引,那么根据数组或子文档的进行查找时也是索引查找
    e.g.如果对score域创建索引则下面的查找也是索引查找
    db.class2.find({'score.0':60},{_id:0})
  3. 覆盖索引
    查找操作需要获取的域,只有索引域没有其他域,此时索引表可以直接提供给用户想要的内容,提高查找效率
    db.class1.find({name:'小白'},{_id:0,name:1,age:1})
  4. 唯一索引
    1. 创建的索引,索引域值无重复,此时可以创建唯一索引,唯一索引数据结构更加便于查找
    2. e.g.对name创建唯一索引,name的值不能有重复
      db.class1.ensureIndex({name:1},{unique:true})
    3. 当对某个域创建唯一索引,该域就不能再插入重复数据
  5. 稀疏索引(间隙索引)
    1. 只针对有指定域的文档创建索引表,如果某个文档没有该域不会插入到索引表中
    2. e.g.对age创建稀疏索引
      db.class1.ensureIndex({age:1},{sparse:true})

索引约束

  1. 索引表也需要占用一定的磁盘空间
  2. 当数据发生更新时索引表也要随之更新
  3. 综上:数据比较大时更适合创建索引,数据量较小时没有必要付出索引代价,
    频繁进行查找操作而不是更新删除插入操作,此时更适合使用索引

固定集合

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)" }

作业:

  1. 熟练mongodb修改操作
  2. 熟练索引的创建方法

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值