mongob复习

2018-09-04  本文已影响0人  dream_seeker

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()

小于 lt 小于等于lte
db.集合名.find({key:{$lt:10000}}).count()#薪资小于10000有多少人

大于gt 大于等于gte 不等于$ne

、逻辑运算符、

or db.集合名.find({or:[{xinzi:{$gt:10000}},{name:'小明'}]})#薪资大于10000或叫小明的人

范围运算符

in db.集合名.find({age:{in:[19,20,30]})年龄是19、20、30 三数任意一个
$nin 不再之内的

正则查询:(一定是子符串)

db.集合名.find({name:/^李.?/}) #姓李的人查出来
db.集合名.find({name:{$regex:'^李.
?'}})

自定义查询:

db.集合名.find({$where:function(){reture this.name == '李磊'}})

mongd聚合操作

groupproject
matchskip
limitunwind
$sort

函数

sumavg
maxmin
pushlast
$first

group:分组 db.集合名.aggregate({group:{_id:'class',count:{sum:1}}})#根据class分组,并求出班级都有几个

班级的平均年龄:

db.集合名.aggregate({group:{_id:'key',avg:{avg:'age'}}})

返回班级中的年龄最大致,最小年龄

db.集合名.aggregate({group:{_id:'key',maxage:{max:'age'}}})
db.集合名.aggregate({group:{_id:'key',minage:{min:'age'}}})

push:根据班级进行分组,返回班级下所有的同学名字,返回的是一个数组

db.集合名.aggregate({group:{_id:'class',names:{push:name}}})

last返回集合最后一个名字

db.集合名.aggregate({group:{_id:'null',lasts:{last:'$name'}}})

last返回集合第一个名字

db.集合名.aggregate({group:{_id:'null',firsts:{first:'$name'}}})

project 只返回习性名、年龄

db.集合名.aggregate([{$project:{name:1,age:20,_id:0}}])

match 过滤 返回年龄在90 - 100 之间的结果

db.集合名.aggregate([{match:{age:{gt:90,$lt:100}}}])

sort 返回年龄在90 - 100 之间的结果 排序

db.集合名.aggregate([{match:{age:{gt:90,lt:100}}},{sort:{age:-1}}])

unwind:将文档中的键对应的数组,拆分成单挑独立数据

tags:[aaa,ddd,fff]
db.集合名.aggregate([{unwind:'tags'}])

跳过和限制查询

db.集合名.aggregate([{match:{age:{gt:30}}},{skip:2},{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({text:{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、不能命中的索引情况in \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()

上一篇下一篇

猜你喜欢

热点阅读