MongoDB数据库常用语句
1. 数据库级常用操作
use databaseName # 使用库 / 创建库,不会立即创建,当需要等到插入数据时数据库才会创建
show dbs # 查看系统中的数据库
db.dropDatabase() # 删除数据库
2. 集合常用操作
db.createCollection(collection_name) # 创建名字为collection_name的集合
db.collection_name.insert(...) # 插入文档,如集合不存在则自动创建
show collections # 查看库中的集合
show tables
db.collection.drop() # 删除集合
db.collection.renameCollection("new_name") # 重命名集合
db.collection.insert() # 插入文档
db.collection.save() # 插入文档
db.class0.insertOne({name:"Levi",age:20,sex:'m'}) # 插入一条文档
db.class0.insertMany([{name:"John"},{name:"Lenzer"}]) # 插入多条文档
3. 文档常用操作
db.collection.find() # 同SQL ----> select * from table
find(query,field) # query 查找条件,相当于where子句
# field 查找的域, 0不显示,1显示
db.class0.findOne({sex:'w'},{_id:0,name:1}) # 查询满足条件的第一条文档
用于query的特殊操作符:
比较操作符:
$eq 等于 == ; $lt 小于 < ; $lte 小于等于 <=; $in 包含
$ne 不等于 !=; $gt 大于 > ; $gte 大于等于 >=; $nin 不包含
逻辑操作符:
$and 逻辑与; $or 逻辑或; $not 逻辑非; $nor
Array数组相关:
$all e.g. db.class.find({score:{$all:[49,67]}},{_id:0}) 查找同时包含49 67的文档
$size e.g. db.class1.find({score:{$size:2}},{_id:0}) 查找score中包含两个元素的文档
$slice e.g. db.class1.find({},{_id:0,score:{$slice:2}}) 显示数组前两项
其他常用查找操作符:
$exists e.g. db.class1.find({sex:{$exists:false}},{_id:0}) 查找不存在sex域的文档,true:存在,false:不存在
$mod e.g. db.class1.find({age:{$mod:[2,1]}},{_id:0}) 找出年龄为单数的文档
$type e.g. db.class1.find({name:{$type:2}},{_id:0}) 查找name域值类型为2的文档
查找结果的操作函数:
distinct(filed) db.class0.distinct('age') 获取某个域的值,去重
pretty() db.class0.find().pretty() 格式化显示查询结果
limit(n) db.class0.find({},{_id:0}).limit(3) 显示查询结果前三条
skip(n) db.class0.find({},{_id:0}).skip(5) 跳过前5条文档,显示后面的查询结果
count() db.class0.find({sex:'w'},{_id:0}).count() 统计性别为w的文档个数
sort({field: 1/-1}) db.class0.find({},{_id:0}).sort({age:-1}) 查找结果按照降序排序
remove(query,justOne) db.class1.remove({sex:{$exists:false}}) 删除所有不存在sex域的文档
justOne=true db.class1.remove({sex:'w'},true) 删除第一条性别为w的文档
db.class1.remove({}) 删除class1中所有文档
update(query,update,upsert,multi) query 筛选条件 用法同find
update 要修改成什么内容 通常配合修改操作符(修改器)使用
upsert 布尔值,默认是false 如果query没有筛选到文档则不做任何操作
如果设置为true 则如果query没有筛选到匹配文档则根据query和update内容插入新的文档
multi 布尔值 默认false 表示如果有多条符合条件文档则只修改第一条
如果设置为true则表示修改所有符合条件文档
db.class0.update({name:'Tom'},{$set:{age:18}}) 将Tom的年龄修改为18
修改器:
$set e.g. db.class0.update({name:'Lily'},{$set:{age:17}}) Lily年龄修改为17
$unset e.g. db.class0.update({name:'Abby'},{$unset:{sex:''}}) 删除Abby的sex域,sex后为空字符串
$rename e.g. db.class0.update({},{$rename:{sex:'gender'}},false,true) 将sex域名改为gender
$setOnInsert e.g.
$inc e.g. db.class0.update({},{$inc:{age:1}},false,true) 所有人年龄加1
$mul e.g. db.class0.update({},{$mul:{age:0.5}},false,true) 所有人年龄乘以0.5
$min e.g. db.class0.update({name:'Levi'},{$min:{age:20}}) Levi age如果大于20则修改为20
$max e.g. db.class0.update({name:'Lenzer'},{$max:{age:19}}) 如果Lenzer age 小于19则改为19
数组修改器:
$push e.g. db.class1.update({name:'小红'},{$push:{score:91}}) 给小红 score数组中添加一项91
$pushAll e.g. db.class1.update({name:'小乔'},{$pushAll:{score:[94,10]}}) 给小乔 score数组中添加多项
$pull e.g. db.class1.update({name:'小红'},{$pull:{score:78}}) 从小红 score数组中删除一项78
$pullAll e.g. db.class1.update({name:'小乔'},{$pullAll:{score:[92,10]}}) 从小乔 score数组中删除多项
$each e.g. db.class1.update({name:'小乔'},{$push:{score:{$each:[99,10]}}}) 分别插入99 10
$position e.g. db.class1.update({name:'小明'},{$push:{score:{$each:[67],$position:1}}}) 将67 插入到数组1号位置
$sort e.g. db.class1.update({},{$push:{score:{$each:[],$sort:-1}}},false,true) 将所有score域的数组降序排序
$pop e.g. db.class1.update({name:'小明'},{$pop:{score:-1}}) 删除小明score中第一项,1:最后一项,-1:第一项
$addToSet e.g. db.class1.update({name:'小刚'},{$addToSet:{score:81}}) 如果数组中没有81 则添加81
时间数据类型
# mongo中存储时间大多为 ISODate
new Date() e.g. db.class2.insert({book:'Python入门',date:new Date()}) 自动生成当前时间
ISODate() e.g. db.class2.insert({book:'Python精通',date:ISODate()}) 自动生成当前时间
db.class2.insert({book:'Python崩溃',date:ISODate("2018-07-01 11:15:56")} 指定时间
Date() e.g. db.class2.insert({book:'Python疯狂',date:Date()}) 将系统时间转换为字符串
valueOf() e.g. db.class2.insert({book:'Python涅槃',date:ISODate().valueOf()}) 获取当前标准时间时间戳
4.索引
db.class0.ensureIndex({name:1}) 根据name域创建索引(1:正序索引,-1:逆序索引)
db.class0.ensureIndex({age:1},{name:'ageIndex'}) 对age域创建索引命名ageIndex
db.collection.getIndexes() 查看集合中索引
db.class0.dropIndex({name:1}) 删除索引,根据键值对
db.class0.dropIndex('ageIndex') 删除索引,根据索引名
db.collection.dropIndexes() 删除所有索引
索引类型:
db.class0.ensureIndex({name:1,age:-1},{name:'name_age'}) 复合索引
db.class0.ensureIndex({name:1},{unique:true}) 唯一索引
db.class0.ensureIndex({age:1},{sparse:true}) 稀疏索引(间隙索引) 只对有age域的文档创建索引
5.聚合操作
db.collection.aggregate() # 聚合条件 ---》 聚合操作符
db.class0.aggregate({$group:{_id:'$gender',num:{$sum:'$age'}}}) # $group 分组聚合 需要配合具体的分组统计选项 $sum : 求和
# $avg : 求平均数, $max 求最大值,$min 求最小值
db.class0.aggregate({$project:{_id:0,name:1,age:1}}) # $project 修改文档的显示效果
db.class0.aggregate({$match:{age:{$gt:18}}}) # $match 数据筛选 过滤年龄大于18岁的数据文档
db.class0.aggregate({$limit:3}) # $limit 筛选前几条文档
db.class0.aggregate({$skip:3}) # $skip 跳过几条文档显示
db.class0.aggregate({$sort:{age:1}}) # 将数据排序
聚合管道: 将上一个聚合的操作结果给下一个聚合继续操作
db.collection.aggregate([{聚合},{},{}...])
db.class0.aggregate([{$match:{gender:'m'}},{$project:{_id:0}},{$sort:{age:1}}]) # match --> project --> sort
6.固定集合
mongodb中可以创建大小固定的集合,称之为固定集合
特点: 能够淘汰早期数据
插入和顺序查找速度更快
可以控制集合的空间大小
使用: 临时缓冲
日志处理
db.createColleciton(collection,{capped:true,size:10000,max:1000}) # capped:true 表示创建固定集合
# size: 表示指定集合的大小字节
# max: 指定集合存放文档上限
7. pymongo
安装: sudo pip3 install pymongo
conn = pymongo.MongoClient('localhost',27017) # 1.创建数据库连接对象
db = conn.stu # 2.生成数据库对象
myset = db.class0 # 3.生成集合对象
# 4. 集合操作 (增删改查索引聚合)
conn.close() # 关闭数据库连接
增:insert() insert_many() insert_one() save()
查:find() find_one()
改:update(query,update,upsert=False,multi=False) update_many() update_one()
删:remove(query,multi = True)
cursor = db.class0.find()
cursor.hasNext() # 查看是否有下一个结果
cursor.next() # 获取下一个结果
游标 cursor 属性: next() limit() skip() count() sort()
数据库的备份和恢复
备份 mongodump -h host -d dbname -o bak
恢复 mongorestore -h dbhost:port -d dbname path