(三)MongoDB

修改操作符

$set  修改一个域的值,或者增加一个域

    e.g. 修改功能,如果该域不存在则增加这个域
       db.class.update({age:18},{$set:{name:'小魏'}})

$unset  删除一个域

    e.g.  sex 后面为空表示删除一个域
    db.class.update({name:'小魏'},{$unset:{sex:''}})

$rename  修改一个域的名称

    e.g.  把域名sex改为gender 
    db.class.update({},{$rename:{sex:'gender'}},false,true)

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

    e.g. 如果执行插入操作则将setOnInsert中内容也插入
    db.class.update({name:'Tom'},{$set:{age:17},$setOnInsert:{gender:'m',tel:'12345'}},true)

*在update参数中可以同时写多个修改器

$inc  加减修改器

    e.g. 所有人年龄增加1
    db.class.update({},{$inc:{age:1},false,true)

* $inc值可以是负数 整数 小数

$mul  乘法修改器

    e.g. Tom的年龄乘以2
    db.class.update({name:'Tom'},{$mul:{age:2})

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

$max  指定了某个域值的下限,如果小于指定值则修改为指定值

    e.g. 将年龄不到20的修改为20
    db.class.update({},{$max:{age:20},false,true)

$min  指定了某个域值的上限,如果大于指定值则修改为指定值

    e.g.  年龄大于20的修改为20
    db.class.update({},{$min:{age:20},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:[10,6]}})

$each 对多个值逐一操作

    e.g. 
    db.class3.update({name:'小明'},{$push:{score:{$each:[5,6]}}})

$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()  自动生成当前时间
    e.g.
    db.class2.insert({title:'Python入门',date:new Date()})

方法2: ISODate()  生成当前时间
    e.g.
    db.class2.insert({title:'Python精通',date:ISODate()})

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

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

时间戳

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 内部文档

文档内某个域的值还是一个文档,则这个文档为内部文档

* 当需要使用内部文档某个域的时候,可以使用外部文档 . 的方法引用内部文档,但是注意此时需要加引号

{"book1" : { "title" : "python爬虫", "price" : 36.5, "author" : "zhangsan" } }
{ "book2" : { "title" : "python Web", "price" : 42, "author" : "lisi" } }

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岁,兴趣爱好变为跳舞画画
2.追加小明兴趣爱好 唱歌
3.追加小王兴趣爱好,吹牛,打篮球
4.小李兴趣多了跑步唱歌,但是要确保和之前的不重复
5.班级所有人的年龄加1
6.删除小明的sex属性
7.删除小李的第一个爱好
8.删除小红的兴趣画画和唱歌

db.class.update({name:'zhao'},{$set:{age:8,hobby:['dance','sing']}})
db.class.update({name:'li'},{$push:{hobby:['sunning']}})
{$pushAll:{hobby:['chuiniu','basketball']}}
{$addToSet:{hobby:{$each:['running','sing']}}}
{$inc:{age:1}},false,true
{$unset:{sex:''}}
{$pop:{hobby:-1}}
{$pullAll:{hobby:['draw','sing']}}

索引

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

mongodb创建索引

ensureIndex()
功能:创建索引
参数:索引域,索引类别和选项

e.g. 根据name创建索引
db.class.ensureIndex({name:1})

*1表示正序 -1逆序

查看一个集合中的索引

db.class.getIndexes()

* _id是系统自动创建的索引

自定义索引名称

db.class.ensurIndex({name:1},{name:'name_index'})

删除索引
dropIndex()
功能:删除索引
参数:要删除的索引,可以是索引名称或者索引键值对

db.class.dropIndex({'age_index'})

db.class.dropIndex({name:-1})

dropIndexes()
删除所有索引 除了_id

e.g.  db.class.dropIndexes()

索引类型

复合索引
根据多个域创建一个索引

db.class.ensureIndex({name:1,age:-1})

数组和子文档索引

如果对某个域创建索引,值为数组或者子文档,则通过数组或子文档进行查找时也是索引查找

覆盖索引

查找返回的内容,仅仅是索引表存储的内容,不需要再去原数据库查找

唯一索引

创建索引时希望集合中创建索引的域的值均不重复
e.g.
db.class1.ensureIndex({name:1},{unique:true})

* 创建唯一索引的域的值不可以重复

稀疏索引(间隙索引)

只针对有指定域的文档创建索引表,如果某个文档没有该域则不做索引处理

e.g.  创建age域的稀疏索引
db.class1.ensureIndex({age:1},{sparse:true})


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

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

聚合操作

对文档的更高级的筛选整理统计

db.collection.aggregate()
功能:聚合函数,完成聚合操作
参数:聚合条件 --> 聚合操作符

聚合操作符

$group 分组聚合 需要配合分组统计操作符使用

    $sum: 求和
        db.class1.aggregate({$group:{_id:'$sex',num:{$sum:1}}})
                         分组 按sex内容分组 自定义统计域 统计什么

        e.g. 统计所有男生和女生的年龄之和
        db.class1.aggregate({$group:{_id:'$sex',num:{$sum:'$age'}}})

    $avg 求平均
        e.g. 求每个性别的平均年龄
        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'}}})

$project
用于修改文档的显示效果

    e.g.
    db.class.aggregate({$project:{_id:0,sex:0}})

    e.g. 指定显示域名
    db.class.aggregate({$project:{_id:0,name:'$name',Age:'$age'}})

$match 过滤数据

    e.g. 年龄大于10的
    db.class.aggregate({$match:{age:{$gt:10}}})

作业:熟练mongodb增删改查操作
     熟练索引操作

猜你喜欢

转载自blog.csdn.net/zh__quan/article/details/81213375