mongodb简单实用

2021-01-18  本文已影响0人  出题老头

安装

  • 在线安装:
sudo apt-get -y mongodb-org
  • deb源码安装:
sudo dpkg -i package.deb
  • 源码安装
  1. tar -zxvf xxxx.taz
  2. sudo mv -r xxxx /usr/local/mongodb
  3. sudo vim .bashrc
  4. export PATH=/usr/local/mongodb/bin:$PATH

服务启动停止

测试启动停止

sudo service mongod start
sudo service mongod stop
sudo service mongod restart

生产启动停止

参数说明

  • sudo mongod 启动时,数据默认存在/data/db下,文件需要手动创建
  • --dbpath:数据存放路经 ,使用:sudo mongod --dbpath=/home/data/aaaa
  • --logpath:日志路径
  • --append或--logappend:设置日志写入行为为追加
  • --fork或-fork:开启新的进程运行mongodb服务
  • --f或者-f:配置文件路径 sudo mongod -f /aa/mongo.conf
  • --auth:权限认证方式启动

自定义配置文件

dbpath=/home/zhangyu/mymongo/db
logpath=/home/zhangyu/mymongo/mymongo.log
logappend=true
fork=true

客户端启动停止

数据库操作

集和操作

数据类型

增删改查

db.集合名.find()
db.集合名.findOne()
db.集和名.find().pretty() //美化输出

运算符

db.stu.find({age:{$gt:18}})

条件运算

db.stu.find({age:{$gt:18}},gender:true)
db.stu.find($and[{age:{$gt:18}},{gender:true}])

范围运算

db.stu.find({age:{$in:[18,19,20]}})

正则

查询开头是“黄”的数据:

db.stu.find({name:{$regex:'^黄'}})

自定义查询

db.stu.find({$where:
    function(){
        this.age > 18
    }
)

查询结果操作

db.stu.find().limit(1)
db.stu.find().skip(1) //跳过一条查询结果

skip和limit配合可制作分页逻辑:

db.stu.find().skip(0).limit(10) // 第一页
db.stu.find().skip(10).limit(10) // 第二页

⚠️:skip和limit配合时候不论谁先写前面,都是skip先起效果

db.stu.find({},{name:1,age:1}) //不想看的不写即可,不能写xxx:0【objid可以写0】
db.stu.find().sort({age:1})//1升序,-1降序
db.stu.find().count()
db.stu.count()
db.stu.count({age:19})
db.stu.find({age:18}).count()
db.stu.distinct("hometown") // 不重复的展示出乡村列表
db.stu.distinct("hometown",{age:18}) //查询结果去重

基础格式:

//query:查询条件
//update:修改内容
//muti:false:只更新第一条(默认),否则更新全部
db.stu.update({query},{update},{muti:boolean}) 

实例:

# 把一班所有的数据的饭全改为屎,且覆盖整条文档
db.stu.update({class:"1"},{eat:"shit"})
# 只会把一班对应的吃这个key修改,该条文档其他值不变
db.stu.update({class:"1"},{$set:{eat:"shit"}})
# 更新多条,注意:用muti时必须使用$set
db.stu.update({class:"1"},{$set{eat:"shit"}},{muti:true})

upsert操作

功能为:找到就修改,找不到就新增一条数据

db.stu.update({name:"laotou"},{$set{eat:"shit"}},{upsert:true})

删除

# 删除全部符合条件的
db.stu.remove({name:"laotou"},{justOne:false})

聚合操作

使用aggregate函数,常用的是group管道

# 每一个大括号都是一个管道
db.stu.aggregate({},{},...)
  • _id:使用键进行分组
# 使用gender的值将数据分组
db.stu.aggregate({$group:{_id:"$gender"}})
# 根据gender分组后,显示数据里增加一个计数器显示,表达式为累加,每次+1,⚠️:不能是0
db.stu.aggregate({$group:{_id:"$gender",counter:{$sum:1}}})

⚠️:除了_id,其他的键都可以自己定义,然后被显示在结果中

  • 分组求和(和上面的是一个体系的):
# 注意sum的值不是1了,而是求和的依据是哪个key
db.stu.aggregate({$group:{_id:"$gender",age_sum:{$sum:"$age"}}})
  • 求平均数
# 和求和一个意思
db.stu.aggregate({$group:{_id:"$gender",avg_age:{$avg:"$age"}}})
  • 在分组结果里构建一个数据组
db.stu.aggregate({$group:{_id:"$gender",name_list:{$push:"$name"}}})
  • 常用表达式总结
  1. sum:计算综合,sum:1每次+1
  2. $avg:平均值
  3. $max:获取最大值
  4. $push:在结果集中,插入值到数组中
  • 其他骚操作:不分组但使用分组函数
# 不分组,但计算总数量
db.stu.aggregte({$group:{_id:null,counter:{$sum:1}}})

match管道

用法非常简单

# 找出18岁的人,进行性别分组
db.stu.aggregate({$match:{age:18}},{$group:{_id:"$gender"}})
# 模糊匹配"黄",然后再分组
db.stu.aggregate({$match:{name:/黄/}},{$group:{_id:"$gender"}})

project管道

相当于投影(select key1 key2 .....)


# ⚠️投影的key可以是分组时构造出的新名字哟!!!
db.stu.aggregate({$group:{_id:"gender",avg_age:{$avg:"$age"}}},{$project:{avg_age:1}})

sort管道

# 1:升序,-1:降序
db.stu.aggregate({$sort:{age:1}})

limit和skip管道

⚠️:由于管道的执行有先后顺序,所以这里的limt和skip不能用来分页,分完就乱套了,当然如果想强行装逼也可以用。

# 先找到10条,再跳过两条
db.stu.aggregate({$limt:10},{$skip:2})

拆分管道

如果有的字段对应一个数组,可以根据这个数组将一条数据拆分开

# 根据size拆分,不展示异常数据
db.stu.aggregate({$unwind:"$size"})

# 根据size拆分,并且展示没有size属性和有属性但没有值的数据
db.stu.aggregate({$unwind:{path:"$size",preserveNullAndEmptyArrays:true}})

索引

⚠️查询频繁的时候需要使用索引,增删改频繁时不要用索引

# 1升序,-1降序
db.集合名.ensureIndex({属性:1})
# 之后num对应的value不能再有相同的值了
db.stu.ensureIndex({num:1},{unique:true})
db.集合名.ensureIndex({属性:1,卡卡卡:1})
  • 创建10000条测试数据:
for(int i = 0;i<10000;i++)> {db.stu.insert({name:'test'+i,age:i})}
  • 展示某数据执行的详细信息
db.find({age:9999}).explain("executionStats")
db.stu.getIndexes()
# 利用属性名
db.stu.dropIndex({age:1})
# 利用索引名
db.stu.dropIndex('age_1')

权限管理

mongodb默认没有设置管理员,需要手动添加

  1. 开启验证
    在mongo.conf中添加auth=true
  2. 添加账号
    ⚠️:账号创建在哪个数据库中,就只能登陆哪个数据库
    ⚠️:超管只能创建在admnin数据库里
# 使用超管
use admin
# 创建用户
db.createUser({user:"zhangyu",pwd:"123456",roles:['root']})
# 登陆
db.auth("zhangyu","123456")
db.createUser({user:"zhangyu",pwd:"123456",roles:['readWrite']})
show users # 查看这个库里的用户账号
db.createUser({user:"zhangyu",pwd:"123456",roles:[{db:"库1",role:"read"},{db:"库2",role:"readWrite"}]})
db.dropUser("zhangyu")

mongodb与python交互

登录

pip3 install pymongo
from pymongo import MongoClient
client = MongoClient('120.1.1.1',27017)
collection = client[db名][集和名]
# 认证方式1(不推荐,但仍然可用)
from urllib.parse import quote_plus
user = "zhangyu"
pass = "123456"
host = "129.3.3.4"
port = "27017"
# quote可以对字符串进行编码
uri = "mongodb://%s:%s@%s" % (quote_plus(user),quote_plus(password),host)
client = MongoClient(uri,port=port)
collection = client.db名.集和名

# 认证方式2(推荐)
db=client["admin"]
db.authenticate("zhangyu","123456")
collection = client["库"]["集和"]

集和操作

插入

# 单条插入
col.insert({username:"zhangyu"})
# 多条插入
col.insert([{username:"zhangyu"},{username:"zhangyu2"}])

查询

# 条件查询
for data in collection.find({条件})
    print(data)
# 查询一条
collection.find_one()

更新

# 第一个为查询条件,第二个为更新数据
col.update({"class":"zhangyu"},{"age":"18"})
# 按key更新一条
col.update({},{"$set":{"id":"dddd"}})
# 按key更新多条
col.update({},{"$set":{"id":"dddd"}},muti=True)
# upsert操作
col.update({"查询的key":"查询的value"},{"$set":{"id":"dddd"}},upsert=True)

删除

col.delete_one({"name":"zhangyu"})
col.delete_many({"gender":"1"})
上一篇 下一篇

猜你喜欢

热点阅读