时间数据类型
mongo中存储时间大多为 ISODate
存储当前时间方法
-
new Date()
自动生成当前时间
db.class3.insert({book:'Pyhton入门',date:new Date()})
-
ISODate()
自动生成当前时间
db.class3.insert({book:'Pyhton精通',date:ISODate()})
-
Date()
将系统时间转换为字符串
db.class3.insert({'book':'Python疯狂',date:Date()})
指定时间
/*
ISODate()
功能:生成mongo标准时间类型数据
参数:如果不传参默认为当前时间,传参表示指定时间
“2018-01-01 12:12:12”
"20180101 12:12:12"
"20180101"
*/
db.class3.insert({'book':'Python崩溃',date:ISODate('20190414 16:45:56')})
时间戳
/*
valueOf()
获取某个时间的时间戳
*/
db.class3.insert({'book':'Python挣扎',date:ISODate().valueOf()})
Null类型
- 如果某个域存在却没有值可以赋值为
null
// 添加Pyhton放弃,价格不详,但必须存在
db.class3.insert({'book':'Python放弃',price:null})
- 可以查找某个域不存在的情况
// 用null查找date域不存在的情况
db.class3.find({date:null})
Object(内部文档)
db.class4.insert({name:'鲁迅',sex:'m',book:{title:'狂人日记',price:46.8}})
db.class4.insert({name:'钱钟书',sex:'m',book:{title:'围城',price:48}})
db.class4.insert({name:'老舍',sex:'m',book:{title:'骆驼祥子',price:51.5}})
- 文档内部某个域的值还是一个文档数据则这个文档就是内部文档类型数据
- 通常使用外部文档域名
.
引用内部文档域名的方式使用内部
// 查找狂人日记
db.class4.find({'book.title':'狂人日记'})
// 修改价格
db.class4.update({'book.title':'围城'},{$set:{'book.price':46}})
// 通过数组下标直接操作某一项
// 通过数组下标引用第一项进行查找
db.class1.find({'score.0':{$gt:90}},{_id:0})
// 修改小刚的一个成绩
db.class1.update({name:'小刚'},{$set:{'score.1':80}})
索引
指建立指定键值及所在文档存储位置的对照清单,使用索引可以方便我们进行快速查找,减少遍历次数提高查找效率
索引操作
- 创建索引
db.collection.ensureIndex()
/*
功能:创建索引
参数:索引域和索引选项
1表示正序索引 -1表示逆序索引
*/
// 根据name域创建索引
db.class0.ensureIndex({name:-1})
- 查看集合中索引
db.collection.getIndexes()
// 查看class0中的索引
db.class0.getIndexes()
- 自定义索引名称
db.collection.ensureIndex({},{name:'nameIndex'})
// 对age域创建索引命名ageIndex
db.class0.ensureIndex({age:1},{name:'ageIndex'})
- 删除索引
db.collection.dropIndex("index")
/*
功能:删除索引
参数:要删除的索引名称或者键值对
*/
// 删除name的索引
db.class0.dropIndex({anme:-1})
// 删除ageIndex索引
db.class0.dropIndex('ageIndex')
- 删除所有索引
db.collection.dropIndexes()
// _id是系统自动创建的主键索引,不能删除
// 删除class0所有索引
db.class0.dropIndexes()
索引类型
复合索引
根据多个域创建一个索引
// 根据name和age域创建name_age索引
db.class0.ensureIndex({name:1,age:-1},{name:'name_age'})
数组索引(子文档索引)
如果对某个域的值为数组或者子文档的域创建索引,那么通过数组或者子文档中某一项进行查找也是索引查找
唯一索引
- 创建索引的域,要求域所对应的值不能够重复
- 对某个域创建了唯一索引就不能插入重复的值
db.class0.ensureIndex({name:1},{unique:true})
稀疏索引(间隙索引)
只针对有指定索引域的文档创建索引,没有该域的文档不会插入到索引表
// 只对有age域的文档创建索引
db.class0.ensureIndex({age:1},{sparse:true})
索引约束
- 索引表需要占用一定的数据库磁盘空间
- 当对数据进行增删改查等写入操作时索引也需要更新,降低了数据修改的
综上:
数据量较小时不适合创建索引,当数据库进行频繁的修改操作而不是查找操作时也不适合创建索引。针对一个集合并不是创建索引越多越好
聚合操作
对文档的筛选结果进行整理统计
db.collection.aggregate()
/*
功能:完成聚合操作
参数:聚合条件 ---> 聚合操作符
*/
聚合操作符
-
$group
分组聚合需要配合具体的分组统计选项-
$sum
求和 -
$avg
求平均数 -
$max
求最大值 -
$min
求最小值
-
// 分别统计男女生人数
db.class0.aggregate({$group:{_id:'$gendar',num:{$sum:1}}})
// 分别统计男女生年龄总和
db.class0.aggregate({$group:{_id:'$gendar',num:{$sum:'$age'}}})
// 分别计算男女生年龄的平均数
db.class0.aggregate({$group:{_id:'$gendar',avg:{$avg:'$age'}}})
// 按性别计算最大值和最小值
db.class0.aggregate({$group:{_id:'$gendar',max:{$max:'$age'}}})
db.class0.aggregate({$group:{_id:'$gendar',min:{$min:'$age'}}})
-
$project
修改文档的显示效果
// 修改文档的显示效果,project值得用法和find函数field格式一致
db.class0.aggregate({$project:{_id:0,name:1,age:1}})
// 以指定的名称显示文档
db.class0.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})
-
$match
数据筛选,$match
值得用法同query
一致
// 过滤年龄大于18岁的数据文档
db.class0.aggregate({$match:{age:{$gt:18}}})
-
$limit
筛选前几条文档
// 筛选前三条数据文档
db.class0.aggregate({$limit:3})
-
$skip
跳过几条文档显示
// 跳过前三条文档
db.class0.aggregate({$skip:3})
-
$sort
将数据排序
// 按照年龄排序
db.class0.aggregate({$sort:{age:1}})
聚合管道
聚合管道指的是将上一个聚合的操作结果给下一个聚合继续操作
db.collection.aggregate([{聚合},{},{}...])
// match --> project --> sort
db.class0.aggregate([{$match:{gender:'m'}},{$project:{_id:0}},{$sort:{age:1}}])
// group ---> match 找到重名学生
db.class0.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])
固定集合
mongodb中可以创建大小固定的集合,称之为固定集合
特点
- 能够淘汰早期数据
- 插入和顺序查找速度更快
- 可以控制集合的空间大小
应用场景
- 临时缓冲
- 日志处理
固定集合操作
- 创建固定集合
db.createColleciton(collection,{capped:true,size:10000,max:1000})
/*
capped:true 表示创建固定集合
size:表示指定集合的大小,以字节为单位
max:指定集合存放文档上限
*/
文件存储
存储文件路径
- 优点
- 节省数据库空间
- 操作简单快捷
- 缺点
- 当数据库或者文件位置发生变化时需要修改数据库内容
存储文件本身
将文件以二进制的形式存储到数据库中
- 优点
- 数据库在文件就在,不会受到迁移等影响
- 缺点
- 占用数据库空间大
- 存取效率低
GridFS存储大文件
在mongodb中认为 >16M 的文件为大文件
GridFS方法
在mongodb中以两个集合配合的方法存储文件
-
fs.files
:存储文件相关信息(文件名,文件类型) -
fs.chunks
:分块存储文件实际内容
存储文件
mongofiles -d dbname put file
/*
dbname:要将文件存入的数据库,如果不存在自动创建
file:要保存的文件
*/
提取文件
mongofiles -d dbname get file
// 提取 test.mp4
mongofiles -d grid get test.mp4
优缺点
- 优点
- 操作方便,提供较好的存储命令,使用数据库存
- 储文件方便移植
- 缺点
- 读写效率低
游标 cursor
- 通过获取操作数据库的返回结果,得到返回结果对象。
- 通过游标可以进一步获取操作结果数据。
// 将返回结果赋给一个js变量,作为查找结果游标
var cursor = db.class0.find()
// 查看是否有下一个结果
cursor.hasNext()
// 获取下一个结果
cursor.next()