MongoDB Day03

MongoDB Day03

修改操作符

  • 在update参数中可以同时写多个修改器
操作符 含义 例子
$set 修改一个域的值,或者增加一个域 修改功能 如果该域不存在则增加这个域:db.class0.update({age:20},{$set:{name:'小薇'}})
$unset 删除一个域 sex后面为空表示删除一个域:db.class0.update({name:'Jame'},{$unset:{sex:''}})
$rename 修改一个域的名称 将sex域名修改为gender:db.class0.update({},{$rename:{sex:'gender'}},false,true)
$setOnInsert 如果update执行了插入文档操作,表示补充插入内容 如果执行插入操作则将setOnInsert中内容也插入:db.class0.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 指定了某个域值的下限,如果小于指定值则修改为指定值 将年龄不到20的修改为20:db.class0.update({},{$max:{age:20}},false,true)
$min 指定了某个域值的上限,如果大于指定值则修改为指定值 年龄大于25的修改为25: db.class0.update({},{$min:{age:25}},false,true)

数组修改器

操作符 含义 例子
$push 向数组中添加一项 db.class3.update({name:'小明'},{$push:{score:5}})
$pushAll 向数组中添加多项 db.class3.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 对数组进行排序 each一起使用,对数组score进行排序:db.class3.update({name:'小红'},{$push:{score:{$each:[],$sort:1}}})
$pop 弹出一项 1表示弹出最后一项 -1表示删除第一项 :db.class3.update({name:'小红'},{$pop:{score:-1}})
$addToSet 向数组中添加一项,不能和已有的内容重复 添加87,不能和已有数据重复:db.class3.update({name:'小红'},{$addToSet:{score:87}})

时间类型

  1. mongodb中存储时间格式 : ISODate()
  2. 方法1 : new Date() 自动生成当前时间
    • e.g.
      db.class2.insert({title:'Python入门',date:new Date()})
  3. 方法2 : ISODate() 生成当前时间

    • e.g.
      db.class2.insert({title:'Python精通',date:ISODate()})
  4. 方法3 Date() 将生成的当前时间变为字符串存储

    • e.g.
      db.class2.insert({title:'Python疯狂',date:Date()})
  5. ISODate()

    1. 功能 : 生成时间类型存储
    2. 参数 : 参数指定时间
      “2018-07-01 12:10:56”
      “20180701 12:10:56”
      “20180701”
    3. e.g.
      db.class2.insert({title:'Python崩溃',date:ISODate("2018-07-01 01:12:12")})

时间戳

  1. 格式: valueOf()
    将时间转换为时间戳
  2. e.g.
    db.class2.insert({title:'Python放生',date:ISODate().valueOf()})

Null —-》 null

  1. 如果某个域存在却没有值,可以设置为null

    1. e.g.
      db.class2.insert({title:'Python涅槃',price:null})

    2. 如果某个域不存在可以使用null匹配

      1. e.g. 找到date域不存在的文档
        db.class2.find({date:null},{_id:0})

Object 内部文档

  1. 文档内某个域的值还是一个文档,则这个文档为内部文档
  2. 注意:* 当需要使用内部文档某个域的时候,可以使用外部文档 . 的方法引用内部文档。但是注意此时需要加引号*

    1. e.g.
      db.class4.find({'book2.title':'python Web'},{_id:0})

    2. e.g.
      db.class4.update({'book1.title':'python爬虫'},{$set:{'book1.price':48.8}})

数组的下标引用

  1. 注意:* 使用数组时,可以使用数组域 . 数组序列下标的方式引用数组的具体某一项
  2. e.g.
    db.class3.find({'score.0':98},{_id:0})
  3. e.g.
    db.class3.update({name:'小明'},{$set:{'score.0':100}})
  4. 查找结果的有序性
    1. 即可以对find的查找结果使用[]的方式引用具体某一条
    2. 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']}}

索引

  1. 索引作用:指建立指定键值对及所在文档中存储位置的对照清单。使用索引可以方便我们快速查找,减少遍历次数,提高查找效率。

  2. mongodb创建索引

    1. ensureIndex()
      功能 : 创建索引
      参数 : 索引域,索引类别和选项
      e.g. 根据name 创建索引
      db.class1.ensureIndex({name:1})
      注意:1表示正序 -1逆序
  3. 查看一个集合中的索引
    db.class1.getIndexes()
    注意:* _id是系统自动创建的索引

  4. 自定义索引名称
    db.class1.ensureIndex({name:1},{name:’name_index’})

  5. 删除索引
    dropIndex()
    功能 : 删除索引
    参数 : 要删除的索引,可以是索引名称或者索引键值对
    e.g. db.class1.dropIndex('age_index')
    e.g. db.class1.dropIndex({name:-1})
  6. dropIndexes()
    删除所有索引 除了_id
    e.g. db.class1.dropIndexes()

索引类型

  1. 复合索引

    1. 根据多个域创建一个索引
    2. e.g. : db.class1.ensureIndex({name:1,age:-1})
  2. 数组和子文档索引
    如果对某个域创建索引,值为数组或者子文档,则通过数组或子文档进行查找时也是索引查找

  3. 覆盖索引
    查找返回的内容,仅仅是索引表存储的内容,不需要再去原数据库查找
  4. 唯一索引
    1. 创建索引时希望集合中创建索引的域的值均不重复
    2. e.g.:db.class1.ensureIndex({name:1},{unique:true})
    3. 创建唯一索引的域的值不可以重复
  5. 稀疏索引(间隙索引)
    1. 只针对有指定域的文档创建索引表,如果某个文档没有该域则不做索引处理
    2. e.g. 创建age域的稀疏索引:db.class1.ensureIndex({age:1},{sparse:true})

索引约束

  1. 当数据发生更新 ,索引也要随之更新。影响插入, 修改,删除操作的效率
  2. 索引表也需要占有一定的磁盘空间

  3. 综上 :当数据量比较小,或者需要频繁的进行数据修 改操作而不是查找操作的时候,不适合创建索引

聚合操作

  1. 对文档的更高级的筛选整理统计
  2. 格式: db.collection.aggregate()

    1. 功能 : 聚合函数,完成聚合操作
    2. 参数 : 聚合条件 —》 聚合操作符
  3. 聚合操作符

  4. $group

    操作符 含义 例子
    $sum 求和 db.class1.aggregate(分组按sex内容分组:{$group:{_id:'$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'}}})
  5. $project

    1. 用于修改文档的显示效果
      1. e.g.
        db.class1.aggregate({$project:{_id:0,sex:0}})
      2. e.g. 指定显示域名
        db.class1.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})
  6. $match 过滤数据

    1. e.g. 过滤年龄大于16的
      db.class1.aggregate({$match:{age:{$gt:16}}})

猜你喜欢

转载自blog.csdn.net/luohongtucsdn/article/details/81201292