MongoDB第三篇
时间类型
获取当前时间:
1.new Date() 自动生成当前时间
db.class1.insert({book:'Python入门',date:new Date()})
2.ISODate() 自动获取当前时间
1.获取当前时间
db.class1.insert({book:'Python精通',date:ISODate()})
2.将指定的时间转换为MongoDB的存储时间类型
db.class1.insert({book:'Python崩溃',date:ISODate('20180101 11:11:11')})
3.Date() 获取系统时间生成时间字符串
db.class1.insert({book:'Python疯狂',date:Date()})
4.valueOf() : 将标准时间转换为时间戳
1.记录当前标准时间的时间戳
db.class1.insert({book:'Python涅磐',date:ISODate().valueOf()})
Null类型数据
1.表示某个域的值为空
1.表示某个域的值为空
db.class1.insert({book:'Python放生',price:null})
2.表达某个域不存在
1.查找gender域不存在的文档(或者gender域值为null)
db.class0.find({gender:null},{_id:0})
内部文档
文档中某个域的值还是一个文档则这个文档为内部文档
*当使用内部文档某个域的值时,需要用外部文档域 . 内部文档域的方法引用。此时需要加引号注明
1.通过 book.title 进行查找
db.class2.find({'book.title':'狂人日记'},{_id:0})
db.class2.update({'book.title':'骆驼祥子'},{$set:{'book.price':46.5}})
数组
*在使用数组时,可以通过数组域 . 数组下标的方式选中数组中具体某一项进行操作
1.查找数组第一项大于80的文档
db.class3.find({'score.0':{$gt:80}},{_id:0})
索引
索引是建立文档所在位置的查找清单,使用索引可以方便进行快速查找,减少遍历次数,提高查找效率
索引约束
1.索引本身也占有数据库空间,所以当数据量很小的时候这种消耗是没有必要的
2.索引表需要根据数据的修改及时修改,否则索引就会不和内容配套,也就失去了意义。因此如果数据库操作是频繁的修改操作而不是查找操作则不适合创建索引
创建索引
db.collection.createIndex()
功能: 创建索引
参数: 索引域 和 索引选项
e.g. 为name域创建索引
db.class0.createIndex({name:1})
* _id域会由系统自动创建索引
* 1 表示正向索引,-1表示逆向索引
查看集合中的索引
db.collection.getIndexes()
自定义索引名
db.class0.createIndex({age:1},{name:"ageIndex"})
其他创建索引的方法
ensureIndex()
功能 : 创建索引
参数 : 同createIndex()
e.g. 创建方法和createIndex用法一致
db.class1.ensureIndex({book:1})
createIndexes([{},{}])
功能 : 同时创建多个索引
参数 : 数组中存入创建索引键值对
e.g. 创建name和score两个域的索引
db.class3.createIndexes([{name:1},{score:-1}])
删除索引
db.collection.dropIndex()
功能 : 删除一个索引
参数 : 索引名称或者索引键值对
e.g. 通过名称删除索引
db.class3.dropIndex('name_1')
e.g. 通过键值对删除索引
db.class3.dropIndex({score:-1})
db.collection.dropIndexes()
功能 :删除集合中的所有索引 (不会删除_id索引)
e.g. 删除class0中所有索引
db.class0.dropIndexes()
索引类型
复合索引 : 根据多个域创建一个索引
e.g. 根据name age创建复合索引
db.class0.createIndex({name:1,age:-1})
子文档和数组索引:如果对某个域创建索引,该域的子文档和数组也会建立 索引查找
e.g. 对book创建索引后,该查找也为 索引查找
db.class2.find({'book.title':'围城'})
唯一索引 : 要求创建索引的域不能有重复的值
e.g. 对name域创建唯一索引
db.class0.createIndex({name:1},{unique:true})
稀疏索引 :会在创建索引时忽略没有指定域的文档
e.g. 对gender域创建稀疏索引
db.class0.createIndex({gender:1},{sparse:true})
聚合操作
对文档进行数据整理和统计
db.collection.aggregate()
功能 : 完成聚合操作
参数 : 聚合条件 需要配合聚合操作符使用
聚合操作符
$group 分组聚合 往往需要配合一定的统计操作符完成
统计求和 : $sum
e.g. 按照gender域的值分组,统计结果叫num,方法为加和
db.class0.aggregate({$group:{_id:"$gender",num:{$sum:1}}})
统计平均数 : $avg
e.g. 按照性别分组,求平均年龄
db.class0.aggregate({$group:{_id:"$gender",num:{$avg:'$age'}}})
求最大值 : $max
e.g. 按性别分组求最大年龄
db.class0.aggregate({$group:{_id:"$gender",num:{$max:'$age'}}})
求最小值 : $min
求第一个数: $first
求最后一个数: $last
$project : 用于格式化的显示文档内容
* 用法同find中field参数
e.g. 按照指定名称显示文档内容
db.class0.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})
$match : 筛选数据
* match用法同find 中的query参数
e.g. 筛选年龄大于19岁的文档
db.class0.aggregate({$match:{age:{$gt:19}}})
$limit 显示前几条文档
e.g. 显示出先3条文档
db.class0.aggregate({$limit:3})
$skip 跳过前几条文档显示后面内容
e.g. 跳过前3条文档显示后面内容
db.class0.aggregate({$skip:3})
$sort 对所选的域排序
e.g. 对文档按年龄升序排序
db.class0.aggregate({$sort:{age:1}})
聚合管道
指的是将多个聚合操作合并到一起完成,即将上一个聚合的结果作为下一个聚合的操作对象继续操作
db.collection.aggregate([{聚合1},{聚合2}…])
1.先排序然后通过project进行显示设置
db.class0.aggregate([{$sort:{age:1}},{$project:{_id:0}}])
2.将所有男生按照年龄排序,不显示_id
$match---> $sort --->$project
db.class0.aggregate([{$match:{gender:'m'}},{$sort:{age:1}},{$project:{_id:0}}])
3.统计一下班里有名字重复的同学
$group --> $match
db.class0.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])
固定集合
指的是mongodb中创建的固定大小的集合,称之为固定集合
特点:能够淘汰早期数据
可以控制集合的大小
插入,查找速度较快
使用:日志处理,临时缓存
1.创建
db.createCollection(collection,{capped:true,size:10000,max:1000})
参数:
capped:true 创建固定集合
size:10000 固定集合大小 字节
max : 1000 最多存放多少文档
e.g. 创建固定集合size 1000 max 3
db.createCollection('log',{capped:true,size:1000,max:3})
文件存储
文件存储数据库的方式:
-
存储路径 : 将本地文件所在的路径以字符串存储到数据库
优点:节省数据库空间
缺点 : 当数据库或者文件发生移动时必须要修改数据库内容
-
存储文件本身 : 将文件转换为二进制存储到数据库
优点:文件随数据库移动,数据库在文件即在
缺点 : 占用数据库空间大,存储效率低
GridFS文件存储方案
目的 : 更好的存储MongoDB中超过16M的大文件
方案解释:在mongodb数据库中创建两个集合共同存储文件,一个存储文件信息,一个存储文件内容。两个集合相互配合
fs.files : 存储文件信息(文件名,大小等)
fs.chunks : 以mongodb二进制格式存储文件内容
1.存储方法
mongofiles -d dbname put file
数据库 要存储的文件
* 数据库不存在会自动创建
e.g. 将img.jpg 存到grid数据库中
mongofiles -d grid put ./img.jpg
2.文件获取
mongofiles -d dbname get file
* file目标文件为fs.files集合文档中 filename值
e.g. 从grid数据库中获取文件
mongofiles -d grid get ./img.jpg
优缺点:
优点 :存储方便,提供了较好的命令,方便数据库移动
缺点 :读写效率较低,不建议用来存储小文件
pymongo 第三方模块
操作步骤:
1. 创建mongodb数据库连接对象
conn = pymongo.MongoClient('localhost',27017)
2. 生成要操作的数据库对象 (__getitem__ __setitem__)
db = conn.stu
db = conn['stu'] #推荐用
3. 生成操作的集合对象
myset = db.class0
myset = db['class0'] #推荐用
4. 通过集合对象调用函数进行数据库操作
略
5. 关闭数据库连接
conn.close()
集合对象调用函数进行数据库操作的具体方法:
插入操作
insert() 插入一条或者多条文档
insert_many() 插入多条文档
insert_one() 插入一个文档
save() 插入一条文档,当有_id域重复会替换原文档
* pymongo中save参数是字典不能为列表
查找操作
find()
功能: 查找所有文档
参数: 同mongo shell 中find
返回: 游标变量
* pymongo 操作数据库时中所有的操作符均使用引号引起来当做字符串 传入
* mongodb中 true false 使用python的 True False即可
* null 使用python的None即可
cursor游标对象属性函数
next() 获取下一个文档
limit() 显示前几条文档
skip() 跳过前几条显示后面内容
count() 统计计数
sort() 排序
pymongo : sort([('age',1),('name',-1)])
mongo shell: sort({age:1,name:-1})
* 当使用游标对象调用limit skip sort等函数时,要求游标对象必须为初始游标,即没有被for或next取值过
find_one()
功能:查找一条文档
参数: 同find
返回: 返回一个字典
修改操作
update()
update_one()
update_many()
删除操作
remove(query,multi=True)
* 默认删除多个,当multi设置为False时只删除一个
delete_one()
delete_many()
索引操作
create_index()
功能 : 创建索引
参数 : 域名 则默认对该域创建正向索引
如果传入列表,列表中每个二维元组代表一个索引项
e.g. [(age,-1)] 表示对age创建逆向索引
list_indexes() 查看索引
drop_index() 删除一个索引
drop_indexes() 删除所有索引
聚合操作
aggregate([])
参数 : 同mongoshell中的聚合
返回值 : 返回一个和find函数相同的游标对象
文件操作
GridFS文件提取
import gridfs
1.连接数据库,生成数据库对象
conn = MongoClient('localhost',27017)
db = conn.grid
2.生成gridfs对象
fs = gridfs.GridFS(db)
3.通过fs获取存储的文件集合
files = fs.find()
4.挑选想获取的文件进行读取
GridFS文件存储
1.连接数据库,生成数据库对象
conn = MongoClient('localhost',27017)
db = conn.grid
2.生成gridfs对象
fs = gridfs.GridFS(db)
3.通过fs.put()函数将读取出来的文件内容存入数据库
fs.put(data,filename)
参数 : data 要存入的二进制内容
filename 文件存入的名称