mongodb索引 操作符

修改操作符的使用

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

e.g.  阿哲年龄修改为33
db.class1.update({name:'阿哲'},{$set:{age:33}})

e.g.  如果sex域不存在则会添加这个域
db.class1.update({name:'阿蓉'},{$set:{sex:'w'}})


$unset
删除一个域

e.g.  删除sex域
db.class1.update({name:'小陈'},{$unset:{sex:''}})

* 每个操作符可以同时操作多项
e.g.
db.class1.update({name:'陈'},{$set:{age:36,sex:'m'}})

* 一次修改可以同时使用多个操作符
e.g.
db.class1.update({name:'阿宝'},{$set:{name:'老王'},$unset:{sex:''}})

$rename
修改域名

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

$setOnInsert
如果第三个参数为true且插入数据,则表示插入文档的补充内容。如果不插入文档则不起作用

e.g.  如果插入新文档则setOnInsert中键值对也作为文档内容
db.class1.update({name:'阿文'},{$set:{age:32},$setOnInsert:{gender:'m'}},true)

$inc
加减修改器

e.g.
db.class1.update({},{$inc:{age:-1}},false,true)

$mul
乘法修改器

e.g.
db.class2.update({},{$mul:{age:2}},false,true)

* $inc   $mul  参数可以使整数小数正数负数

$min 
如果筛选文档指定域的值小于min值则不修改,大于min值则修改为min值

e.g.  如果age大于18则修改为18
db.class2.update({},{$min:{age:18}},false,true)

$max
如果筛选文档指定域的值大于max值则不修改,小于max值则修改为max值

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


数组修改器

$push   向数组中添加一项

e.g.  向score数组中添加一项
db.class2.update({name:'小亮'},{$push:{score:91}})

$pushAll  向数组中添加多项

db.class2.update({name:'小明'},{$pushAll:{score:[5,10]}})

$pull  从数组中删除一项

e.g.
db.class2.update({name:'小明'},{$pull:{score:10}})

$pullAll  从数组中删除多项

e.g. 
db.class2.update({name:'小明'},{$pullAll:{score:[58,5]}})


$each  对多个值进行逐一操作

e.g.
db.class2.update({name:'小明'},{$push:{score:{$each:[60,10]}}})


$position  指定插入位置

e.g.  配合each使用将数据插入到指定位置
 db.class2.update({name:'小红'},{$push:{score:{$each:[5],$position:1}}})

$sort  对数组进行排序

e.g.  对数组进行排序
db.class2.update({name:'小明'},{$push:{score:{$each:[],$sort:1}}})

$pop  弹出一项

e.g.   1表示弹出数组中最后一项,-1表示弹出第一项
db.class2.update({name:'小明'},{$pop:{score:-1}})

$addToSet  向数组中添加一项,但是不允许添加重复内容

e.g.  如果数组中没有80则添加80
db.class2.update({name:'小红'},{$addToSet:{score:80}})

时间类型

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

1. 使用new Date() 自动生成当前时间
e.g.
 db.class0.insert({book:'Python入门',date:new Date()})

2. 使用 ISODate() 生成当前时间
e.g. 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"
e.g. 
db.class0.insert({book:'Python崩溃',date:ISODate("2018-07-13 11:23:36")})

时间戳

通过当前的时间生成的一个时间节点标志

valueOf()
生成某个标准时间的时间戳

e.g.
db.class0.insert({book:'Python重生',date:ISODate().valueOf()})


Null 类型

值 : null  

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

e.g.  表示date没有实际意义的值
db.class0.insert({book:'Python编程',date:null})

2. 在查找时可以找到值为null或者不存在某个域的文档

e.g.  查找到date值为null或者不存在date域的文档
 db.class0.find({date:null},{_id:0})

数组的下标操作方式

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

e.g.  查找数组 0 项大于90的文档
db.class2.find({'score.0':{$gt:90}},{_id:0})

e.g.  将score 第1项改为10
db.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.  获取查找结果的 第 2 项
db.class1.find({},{_id:0})[2]


练习 : 
使用之前的grade数据库

1.将小红年龄改为8岁,兴趣爱好变为跳舞画画
{$set:{age:8,hobby:['dance','draw']}}

2. 追加小明兴趣爱好 唱歌
{$push:{hobby:'sing'}}

3. 追加小王兴趣爱好,吹牛,打篮球
{$pushAll:{hobby:['吹牛','basketball']}}

4. 小李兴趣多了跑步唱歌,但是要确保不和以前的重复
{$addToSet:{hobby:{$each:['running','sing']}}}

5. 将该班所有同学年龄加1
update({},{$inc:{age:1}},false,ture)

6. 删除小明的sex属性
{$unset:{sex:''}}

7.删除小李兴趣中的第一项
{$pop:{hobby:-1}}

8,删除小红兴趣中的画画和唱歌
{$pullAll:{hobby:['draw','sing']}}

9. 为小红增加一个域,为  score:{english:93,chinese:92,match:78}

{$set:{score:{english:93,chinese:92,match:78}}}

10. 给小红数学成绩加5分
{$inc:{'score.math':5}}

11. 小明的第一爱好改为computer
{$set:{'hobby.0':'computer'}}


索引

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

Mongodb创建索引

ensureIndex()
功能 : 创建索引
参数 : 第一个为对哪个域创建索引
    第二个为索引的选项

e.g. 对name域创建索引
db.class1.ensureIndex({name:1})

* 1表示正向索引  -1表示逆向索引


查看某个集合中的索引
db.class1.getIndexes()

* _id是系统为每个集合自动创建的索引

自定义索引名称

通过第二个参数传入索引选项实现
e.g.  
db.class1.ensureIndex({age:1},{name:'ageIndex'})

* 同一个域不能重复创建相同的索引,一个集合中索引名也不要相同

删除索引
dropIndex()
功能: 删除一个索引
参数: 索引名或者索引键值对

e.g.
db.class1.dropIndex({name:-1})
e.g.
db.class1.dropIndex("ageIndex")

dropIndexes()
功能:删除所有索引

e.g.  删除class1中所有索引,但是不会删除_id索引
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})

覆盖索引

查找操作需要获取的域,只有索引域没有其他域。此时索引表可以直接提供给用户想要的内容,提高查找效率

唯一索引

创建的索引,索引域值无重复,此时可以创建唯一索引
唯一索引数据结构更加便于查找

e.g.  对name创建唯一索引,name值不能有重复
db.class1.ensureIndex({name:1},{unique:true})

* 当对某个域创建唯一索引,该域就不能再插入重复数据

稀疏索引

只针对有指定域的文档创建索引表,如果某个文档没有该域则不会插入到索引表中

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

索引约束
1. 索引表也需要占用一定的磁盘空间
2. 当数据发生更新时索引表也要随之更新

综上 : 
1. 数据量比较大时更适合创建索引,数据量较小时没有必要付出索引代价
3. 频繁进行查找操作而不是更新删除插入操作,此时更适合使用索引


固定集合

mongodb中可以创建大小固定的集合,称之为固定集合。

特点 :  插入速度更快,顺序查找更快
         可以控制集合的空间大小
     能够自动淘汰早期数据

使用 : 日志处理
        临时缓存

创建

db.createCollection(collection,{capped:true,size:10000,max:1000})

capped:true   创建固定集合
size:10000   固定集合的大小  字节数
max :1000    表示最多多少条文档

e.g.  创建一个固定集合
db.createCollection('log',{capped:true,size:10000,max:3})
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值