修改操作符的使用
$set
修改一个域的值, 增加一个域
阿哲年龄修改为 33
db.class1.update({name:'阿哲'},{$set:{age:33}})
如果 sex 域不存在则会添加这个域
- db.class1.update({name:'阿蓉'},{$set:{sex:'w'}})
- $unset
删除一个域
删除 sex 域
db.class1.update({name:'小陈'},{$unset:{sex:''}})
* 每个操作符可以同时操作多项
db.class1.update({name:'陈'},{$set:{age:36,sex:'m'}})
* 一次修改可以同时使用多个操作符
- db.class1.update({name:'阿宝'},{$set:{name:'老王'},$unset:{sex:''}})
- $rename
修改域名
将 sex 域名改为 gender
- db.class1.update({sex:{$exists:true}},{$rename:{sex:'gender'}},false,true)
- $setOnInsert
如果第三个参数为 true 且插入数据, 则表示插入文档的补充内容. 如果不插入文档则不起作用
如果插入新文档则 setOnInsert 中键值对也作为文档内容
- db.class1.update({name:'阿文'},{$set:{age:32},$setOnInsert:{gender:'m'}},true)
- $inc
加减修改器
- db.class1.update({},{$inc:{age:-1}},false,true)
- $mul
乘法修改器
db.class2.update({},{$mul:{age:2}},false,true)
* $inc $mul 参数可以使整数小数正数负数
$min
如果筛选文档指定域的值小于 min 值则不修改, 大于 min 值则修改为 min 值
如果 age 大于 18 则修改为 18
- db.class2.update({},{$min:{age:18}},false,true)
- $max
如果筛选文档指定域的值大于 max 值则不修改, 小于 max 值则修改为 max 值
将年龄不到 30 的修改为 30
db.class1.update({},{$max:{age:30}},false,true)
数组修改器
$push
向数组中添加一项
向 score 数组中添加一项
- db.class2.update({name:'小亮'},{$push:{score:91}})
- $pushAll
向数组中添加多项
- db.class2.update({name:'小明'},{$pushAll:{score:[5,10]}})
- $pull
从数组中删除一项
- db.class2.update({name:'小明'},{$pull:{score:10}})
- $pullAll
从数组中删除多项
- db.class2.update({name:'小明'},{$pullAll:{score:[58,5]}})
- $each
对多个值进行逐一操作
- db.class2.update({name:'小明'},{$push:{score:{$each:[60,10]}}})
- $position
指定插入位置
配合 each 使用将数据插入到指定位置
- db.class2.update({name:'小红'},{$push:{score:{$each:[5],$position:1}}})
- $sort
对数组进行排序
对数组进行排序
- db.class2.update({name:'小明'},{$push:{score:{$each:[],$sort:1}}})
- $pop
弹出一项
1 表示弹出数组中最后一项,-1 表示弹出第一项
- db.class2.update({name:'小明'},{$pop:{score:-1}})
- $addToSet
向数组中添加一项, 但是不允许添加重复内容
如果数组中没有 80 则添加 80
db.class2.update({name:'小红'},{$addToSet:{score:80}})
时间类型
mongodb 中支持时间格式 : ISODate()
1. 使用 new Date() 自动生成当前时间
db.class0.insert({book:'Python 入门',date:new Date()})
2. 使用 ISODate() 生成当前时间
db.class0.insert({book:'Python 精通',date:ISODate()})
3. 获取计算机时间生成时间格式字符串 Date()
db.class0.insert({book:'Python 疯狂',date:Date()})
指定时间:
ISODate()
功能: 生成 mongodb 时间存储类型
参数: 不加参数生成当前时间
指定时间格式参数:
- "2018-01-01 12:12:12"
- "20180101 12:12:12"
- "20180101"
- db.class0.insert({book:'Python 崩溃',date:ISODate("2018-07-13 11:23:36")})
时间戳:
通过当前的时间生成的一个时间节点标志
valueOf()
生成某个标准时间的时间戳
db.class0.insert({book:'Python 重生',date:ISODate().valueOf()})
Null 类型:
值 : null
1. 如果某个域存在却没有值可以设置为 null
表示 date 没有实际意义的值
db.class0.insert({book:'Python 编程',date:null})
2. 在查找时可以找到值为 null 或者不存在某个域的文档
查找到 date 值为 null 或者不存在 date 域的文档
db.class0.find({date:null},{_id:0})
数组的下标操作方式:
可以通过 域名. 下标 的方式具体操作数组的某一项
查找数组 0 项大于 90 的文档
db.class2.find({'score.0':{$gt:90}},{_id:0})
将 score 第 1 项改为 10
db.class2.update({name:'小红'},{$set:{'score.1':10}})
内部文档操作 (Object):
文档内部某个域的值还是一个文档, 则这个文档称为内部文档类型数据
* 通过 外部域. 内部文档域 的方式引用内部文档中某个域的值进行操作
- db.class3.find({'books.title':'狂人日记'},{_id:0})
- db.class3.update({"books.title":'骆驼祥子'},{$set:{"books.price":48.6}})
查找结果的下标引用
可以通过下标的方式获取查找结果的某一项
获取查找结果的 第 2 项
db.class1.find({},{_id:0})[2]
综合示例 :
使用之前的 grade 数据库
1. 将小红年龄改为 8 岁, 兴趣爱好变为跳舞画画
db.class.update({$set:{age:8,hobby:['dance','draw']}})
2. 追加小明兴趣爱好 唱歌
db.class.update({$push:{hobby:'sing'}})
3. 追加小王兴趣爱好, 吹牛, 打篮球
db.class.update({$pushAll:{hobby:['吹牛','basketball']}})
4. 小李兴趣多了跑步唱歌, 但是要确保不和以前的重复
db.class.update({$addToSet:{hobby:{$each:['running','sing']}}})
5. 将该班所有同学年龄加 1
db.class.update({},{$inc:{age:1}},false,ture)
6. 删除小明的 sex 属性
db.class.update({$unset:{sex:''}})
7. 删除小李兴趣中的第一项
db.class.update({$pop:{hobby:-1}})
8, 删除小红兴趣中的画画和唱歌
db.class.update({$pullAll:{hobby:['draw','sing']}})
9. 为小红增加一个域, 为 score:{english:93,chinese:92,match:78}
db.class.update({$set:{score:{english:93,chinese:92,match:78}}})
10. 给小红数学成绩加 5 分
db.class.update({$inc:{'score.math':5}})
11. 小明的第一爱好改为 computer
db.class.update({$set:{'hobby.0':'computer'}})
索引:
指建立指定键值及所在文档中存储位置的对照清单,
使用索引可以方便我们进行快速查找, 减少数据遍历次数, 从而提高查找效率
Mongodb 创建索引:
ensureIndex()
功能 :
创建索引
参数 :
第一个为对哪个域创建索引
第二个为索引的选项
对 name 域创建索引
db.class1.ensureIndex({name:1})
* 1 表示正向索引 -1 表示逆向索引
查看某个集合中的索引:
db.class1.getIndexes()
* _id 是系统为每个集合自动创建的索引
自定义索引名称
通过第二个参数传入索引选项实现
db.class1.ensureIndex({age:1},{name:'ageIndex'})
* 同一个域不能重复创建相同的索引, 一个集合中索引名也不要相同
删除索引:
dropIndex()
功能:
删除一个索引
参数:
索引名或者索引键值对
- db.class1.dropIndex({name:-1})
- db.class1.dropIndex("ageIndex")
- dropIndexes()
功能:
删除所有索引
删除 class1 中所有索引, 但是不会删除_id 索引
db.class1.dropIndexes()
其他索引类型:
复合索引:
同时根据多个域创建一个索引
根据 name 和 age 域查询都为索引查询, 比单独创建两个索引表更节省空间
db.class1.ensureIndex({name:1,age:-1})
数组和子文档索引:
如果对某个数组和子文档域创建索引, 那么根据数组和子文档的查找均为索引查找
如果对 score 域创建索引则 下面的查找也是索引查找
db.class2.find({'score.0':60},{_id:0})
覆盖索引:
查找操作需要获取的域, 只有索引域没有其他域.
此时索引表可以直接提供给用户想要的内容, 提高查找效率
唯一索引:
创建的索引, 索引域值无重复, 此时可以创建唯一索引
唯一索引数据结构更加便于查找
对 name 创建唯一索引, name 值不能有重复
db.class1.ensureIndex({name:1},{unique:true})
* 当对某个域创建唯一索引, 该域就不能再插入重复数据
稀疏索引:
只针对有指定域的文档创建索引表, 如果某个文档没有该域则不会插入到索引表中
对 age 创建稀疏索引
db.class1.ensureIndex({age:1},{sparse:true})
索引约束:
1. 索引表也需要占用一定的磁盘空间
2. 当数据发生更新时索引表也要随之更新
综上:
1. 数据量比较大时更适合创建索引, 数据量较小时没有必要付出索引代价
2. 频繁进行查找操作而不是更新删除插入操作, 此时更适合使用索引
固定集合:
mongodb 中可以创建大小固定的集合, 称之为固定集合.
特点:
1. 插入速度更快, 顺序查找更快
2. 可以控制集合的空间大小
3. 能够自动淘汰早期数据
使用:
日志处理
临时缓存
创建:
db.createCollection(collection,{capped:true,size:10000,max:1000})
参数:
capped:true:
创建固定集合
size:10000:
固定集合的大小 字节数
max :1000:
表示最多多少条文档
创建一个固定集合
db.createCollection('log',{capped:true,size:10000,max:3})
来源: https://www.cnblogs.com/ParisGabriel/p/9515335.html