mongob复习
mongod服务、开启、关闭、重启、
sudo service mongod start
sudo service mongod stop
sudo service mongod restart
配置文件路径:/etc/mongod.conf
3、链接
mongo
mongo -h ip:port
mongo --host ip --port port
4、mongodb的操作
数据库
查看所有数据库:show dbs
查看当前所在数据库:db
删除数据库db.dropDatabase()
查看数据库的详细信息: db.stats()
5、集合
db.createCollection('集合名字',属性)
设置固定大小集合:
db.createCollection('集合名',{capped:true,size:大小,max:最大文档数量})
删除集合:db.集合名.drop()
6、文档的操作
增加一条:
db.集合名.insert({key:'value'})
增加多条:
db.集合名.insert({key1:'value',key2:'value',key3:'value'})
删除:
删除所有文档:
db.集合名.remove({})
删除符合条件所有文档:
db.集合名.remove({key:value})
删除一条:
db.集合名.remove({key:values},{justOne:true})
修改:
更新文档中的某些建,键存在跟新,不存在添加
db.集合名.update({key:value},{$set:{key:value}})
全文档更新:
db.集合名.update({key:value},{key:value})
全文档更新:如果没找到作为一个新文档插入0)
db.集合名.update({key:value},{key:value})
save:
1、情况:加入我们更新的文档id存在则修改全文档更新,不存在作为新文档插入
db.集合名.save({_id:'value',key:value,key:value,.....})
查找:
db.集合名.find({key:value})根据条件查找
限制查询:
db.集合名.find({条件}).limit(条数)#返回几条结果
跳过查询:
db.集合名.find({条件}).skip(num)#从几条开始
结合使用:
db.集合名.find({条件}).skip().limit()#结果从几条开始,返回几条结果
自定义查询:
db.集合名.find({$where:function(){return this.age>20}})
排序:sort 1 升序 -1 降序
db.集合名.find({条件}).sort({key:1})
投影:project 1 表示显示 0 表示不显示
db.集合名,find({},{name:1,_id:0})
db.集合名.find({},{name:0})
去重:distinct
db.集合名.distinct({age,{name:value}}) #查看姓名是**的人中,年龄都是多大
count()#计算总和
db.集合名.find().count()
db.集合名.count({条件})
type
db.集合名.find({key:{$type:'string'}})#返回所有键为字符串类型的文档
比较运算符
= db.集合名.find({age:20}).count()
小于 lte
db.集合名.find({key:{$lt:10000}}).count()#薪资小于10000有多少人
大于gte 不等于$ne
、逻辑运算符、
or:[{xinzi:{$gt:10000}},{name:'小明'}]})#薪资大于10000或叫小明的人
范围运算符
in:[19,20,30]})年龄是19、20、30 三数任意一个
$nin 不再之内的
正则查询:(一定是子符串)
db.集合名.find({name:/^李.?/}) #姓李的人查出来
db.集合名.find({name:{$regex:'^李.?'}})
自定义查询:
db.集合名.find({$where:function(){reture this.name == '李磊'}})
mongd聚合操作
project
skip
unwind
$sort
函数
avg
min
last
$first
group:{_id:'sum:1}}})#根据class分组,并求出班级都有几个
班级的平均年龄:
db.集合名.aggregate({key',avg:{age'}}})
返回班级中的年龄最大致,最小年龄
db.集合名.aggregate({key',maxage:{age'}}})
db.集合名.aggregate({key',minage:{age'}}})
push:根据班级进行分组,返回班级下所有的同学名字,返回的是一个数组
db.集合名.aggregate({class',names:{name}}})
last返回集合最后一个名字
db.集合名.aggregate({last:'$name'}}})
last返回集合第一个名字
db.集合名.aggregate({first:'$name'}}})
project 只返回习性名、年龄
db.集合名.aggregate([{$project:{name:1,age:20,_id:0}}])
match 过滤 返回年龄在90 - 100 之间的结果
db.集合名.aggregate([{gt:90,$lt:100}}}])
sort 返回年龄在90 - 100 之间的结果 排序
db.集合名.aggregate([{gt:90,sort:{age:-1}}])
unwind:将文档中的键对应的数组,拆分成单挑独立数据
tags:[aaa,ddd,fff]
db.集合名.aggregate([{tags'}])
跳过和限制查询
db.集合名.aggregate([{gt:30}}},{limit:3}])
#######################8、索引
_id索引 在创建文档的时候自动创建 (mongodb的索引都在内存中)
普通、索引:
单键索引
db.集合名.createIndex({key:1})
复合索引
db.集合名.createIndex({key:1,key1:-1})
子文档索引
{students:{name:xiaoming,age:20}}
db.集合名.createIndex({'students.name':1,'students.age':-1})
db.集合名.find({'students.name':'xiaoming','students.age':20})
数组索引
db.集合名.createIndex({tags:1})
全文索引(注意:全文索引中只能创建一个)
db.集合名.createIndex({key:'text'})
使用他:db.集合名.find({search:'关键词'}})
索引属性:
background 在后台创建索引
unique 创建唯一索引
name:给索引取名字
sparse 稀疏索引(如果设置了这个属性,文档中如果含有这个索引键,就创建,否则不创建)
TTL expireAfterSeconds 秒 :该属性设置在文档中存活的时间,超过则删除(注意:我们直接插入一个时间,会跟文档中真正插入的事件,相差8小时)
ttl(TTL)补充:
—id不能设置为日期索引
不能将已经创建的索引修改。只能删除,重新创建
TTL不能是复合索引,只能是单键索引
在固定的集合中不能创建TTL索引
删除索引
db.集合名.dropIndex('索引名')
删除所有索引
db.集合名.dropIndexes()
查看集合中的所有索引
db.集合名.getIndexes()
查看集合中的索引总大小
db.集合名.totalIndexSize()
强制索引
db.集合名.find({条件}).hint(‘索引名’)
索引的重建;
db.集合名.reIndex()
建立索引的注意事项、优点、缺点
优点:相当于创建了一个目录,能过提高查找的效率
缺点:对于插入,删除、修改数据会变慢,因为在做修改数据时,索引也会发生变化,这样会降低效率 2、创建索引会产生额外的 数据加大对硬件的要求
会额外占用内存
注意事项:1、尽量减少创建不必要的索引2、经常变动的键不必创建索引
3、不会成为查询条件的值不需要创建索引 4、mongodb集合中最大索引个数不能超过64个、索引的名称不能超过128个字符,符合索引最大值只能右31个字段
5、不能命中的索引情况nin 范围运算符,以及比较运算符 6、mongodb中索引存放在内存中必须确保不会超过内存
如果超过内存最大。mongodb 会自动删除一些索引
创建用户
创建超级管理员
use admin
db.createUser({
'user':'username'
'pwd':'123456'
'rloes':[{role:root,db.:'admin']
})
打开mongodb的安全设置
sudo vim /etc/mongod.conf
低版本的
sudo vim /etc/mongodb.conf
高版本
sudo vim /etc/mongod.conf
修改完毕之后重置:sudo service mongod restart
使用超管登录:
mongo -u '用户名' -p(’密码‘) --authenticationDatabase 'admin'
修改用户的信息:
db.updateUser('用户名',{pwd:'新密码'})
修改用户民:
db.updateUser('用户名',{user:‘新用户名’})
删除权限:
db.revokeRolesFromUser('用户名',[{role:'权限',db:'数据库'}])
添加权限:
db.grantRolesToUser('用户名',[{role:'权限',db:'数据库'}])
1、删除用户:
db.dropUser('用户名')
2、删除用户:
db.system.users.remove('用户名')
3、查看所有用户:
db.system.users.fond()
数据库的备份
mongodump -h ip:端口 -d 数据库 -o 路径
备份集合
mongodump -h ip:端口 -d 数据库 集合名 -o 路径
用超级用户进行操作
mongodump -u 'boss' -p '123456' --authenticationDatabase 'admin' -d jobs -o ~/桌面/dump/
备份所有数据库
mongodump -h ip:端口 -o 路径
恢复数据库
mongorestore -h 127.0.0.1:27017 -d 数据库名称 --dir ~/Desktop/数据库备份的路径/jobs
恢复所有数据库
mongorestore -h ip:端口 --dir 路径
导出
mongoexport -d 数据库名 -c 集合 -o 路径/文件名.json --type json
mongoexport -d 数据库名 -c 集合 -o 路径/文件名.csv --type csv -f '键名,...'
导入
mongoimport -d 数据库名 -c 集合名 --file 路径/文件名.json --type json
mongoinport -d 数据库名 -c 集合名 --file 路径/文件名.csv --headerline --type csv
mongodb状态检测
mongostat
mongotop
mongod副本集(主从备份)
目的:防止数据灾难 、实时备份、实现主从数据一致性、读写分离、无宕机行为、分担主服务器的压力
缺点:具有中心化,所有的增删改操作都需要在主节点上完成,对主节点的压力较大,对主机的性能要求比较高
如何实现副本集:
开启mongod服务,至少两个
mongod --bind_ip ip --port 端口号 --dapath 数据存放的路径 --replSet rs0
例题:mongod --bind_ip 192.168.43.131 --port 27020 --dbpath ~/桌面/mongodb1 --replSet rs0
怎么链接?
mongo -- host ip --port 端口号
确定主服务器
rs.initiate()
添加从节点
rs.add(ip:端口号)
激活从节点
rs.slaveOk()
mongodb与python交互
监控状态
#service mongod start
mongostat
mongodb与pthon交互
pip3 install pymongo
import pymongo
from bson.objectid import ObjectId
创建mongo客户端链接
mongoConn = pymongo.MongoClient('localhost',27017)
第二种
mongoConn = pymongo.MongoClient('mongodb://localhost:27017/')
第三种用用户密码
mongoConn = pymongo.MongoClient('mongodb://boss:123456@localhost:27017/')
操作数据库下的集合
use_db = mongoConn.数据库
use_db = mongoConn.mongotest
获取数据库下要操作的集合
use_col = use_db.class1804
文档操作
增
def add_data():
document={
'name':'liyong',
'age':20,
'gender':'男',
'calss':'1804'
}
use_col.insert(document)
删
def delete_data():
result = use_col.delete_one({})
#默认删除一条
result = use_col.remove({'name':'liyong'},multi=False)
改
def update_date():
#result = use_col.update({'name':'liyong'},{'$set':{'age':30}})
#更新全部
result = use_col.update({'name':'liyong'},{'name':'lisi','age':40})
#更新多条
result = use_col.update_many({'name':'liyong'},{'name':'lisi','age':40})
#save()
#1、情况:加入我们更新的文档id存在则修改全文档更新,不存在作为新文档插入
resule=use_col.save({_id:'5b83725a9e3227192a28178b',address:'beijing'})
#db.集合名.save({_id:'value',key:value,key:value,.....})
result = use_col.save()
查
返回多条
def find_data():
#find_one查询时会返回一个字典
result = use_col.find_one({'name':'liyong'})
print(result)
#跳过查询
result = use_col.find({}).skip(2).limit(4)
if name == 'main':
add_data()
update_date()
find_data()