mongodb的安装和基本操作以及企业级应用操作

下载安装

mongodb下载地址:
https://www.mongodb.com/download-center/community
linux命令下载:

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.5.tgz

解压

tar -zxvf mongodb-linux-x86_64-4.0.5.tgz
#创建数据库目录
mkdir -p /data/mongo
# 启动mongo
./bin/mongod --dbpath=/data/mongo/

常规参数
在这里插入图片描述
配置文件示例

vim mongo.conf

内容:

dbpath=/data/mongo/
port=27017
bind_ip=0.0.0.0
fork=true
logpath = /data/mongo/mongodb.log
logappend = true
auth=false

启动

已配置文件方式启动

./bin/mongod -f mongo.conf
#启动客户端 连接 本机的地的默认端口
./bin/mongo 
# 指定IP和端口
./bin/mongo --host=127.0.0.1 --port=27017

数据库与集合的基础操作

#查看数据库
show dbs;
#切换数据库
use luban;
#创建数据库与集合,在插入数据时会自动 创建数据库与集和
db.friend.insertOne({name:“wukong”,sex:“man”});
#查看集合
show tables;
show collections;
#删除集合
db.friend.drop();
#删除数据库
db.dropDatabase();

MongoDB CRUD

插入相关方法:
//插入单条 
db.friend.insertOne({name:"wukong",sex:"man"});
// 插入多条
db.friend.insertMany([
{name:"wukong",sex:"man"},{name:"diaocan",sex:"woman",age:18,birthday:new Date("1995-11-02")},{name:"zixiao",sex:"woman"}
]);
// 指定ID 
 db.friend.insert([
{_id:1,name:"wokong",sex:"man",age:1},
{_id:2,name:"diaocan",sex:"women",birthday:new Date("1988-11-    11")}
  ])

基于条件的基础查询

$and、$or、$in、$gt、$gte、$lt、$lte 运算符
#基于ID查找
db.emp.find({_id:1101})
#基于属性查找
db.emp.find({"name":"鲁班"})
# && 运算 与大于 运算
db.emp.find({"job":"讲师","salary":{$gt:8000}})
# in 运算
 db.emp.find({"job":{$in:["讲师","客服部"]}})
# or 运算
db.emp.find({$or:[{job:"讲师"  },{job:"客服部"}] })
db.friend.find({$or:[{"name":"diaocan"},{age:{$gte:18}}]});

基于 sort skip limit 方法实现排序与分页

//  sort skip limit
db.emp.find().sort({dep:1,salary:-1}).skip(5).limit(2)

嵌套查询

# 错误示例:无结果
db.student.find({grade:{redis:87,dubbo:90 });
#错误示例:无结果 
db.student.find({grade:{redis:87,dubbo:90,zookeper:85} })

# 基于复合属性查找 时必须包含其所有的值 并且顺序一至
db.student.find({grade:{redis:87,zookeper:85,dubbo:90} })
#基于复合属性当中的指定值 查找。注:名称必须用双引号
db.student.find({"grade.redis":87});
db.student.find({"grade.redis":{"$gt":80}});

数组查询

db.subject.insertMany([
{_id:"001",name:"陈霸天",subjects:["redis","zookeper","dubbo"]},
{_id:"002",name:"张明明",subjects:["redis","Java","mySql"]},
{_id:"003",name:"肖炎炎",subjects:["mySql","zookeper","bootstrap"]},
{_id:"004",name:"李鬼才",subjects:["Java","dubbo","Java"]},
])
#无结果
db.subject.find({subjects:["redis","zookeper"]})
#无结果
db.subject.find({subjects:["zookeper","redis","dubbo"]})
# 与嵌套查询一样,必须是所有的值 并且顺序一至
db.subject.find({subjects:["redis","zookeper","dubbo"]})

# $all 匹配数组中包含该两项的值。注:顺序不作要求
db.subject.find({subjects:{"$all": ["redis","zookeper"]}})
注:
# 简化数组查询
db.subject.find({subjects:"redis"})
# 简化数组查询 ,匹配数组中存在任意一值。与$all相对应
db.subject.find({subjects:{$in: ["redis","zookeper"]}})

数组嵌套查询

#基础查询 ,必须查询全部,且顺序一至
db.subject2.find({subjects:{name:"redis",hour:12} })
#指定查询第一个数组 课时大于12
db.subject2.find({"subjects.0.hour":{$gt:12}})
#查询任科目 课时大于12
db.subject2.find({"subjects.hour":{$gt:12}})
# $elemMatch 元素匹配,指定属性满足,且不要求顺序一至
db.subject2.find({subjects:{$elemMatch:{name:"redis",hour:12}}})
# 数组中任意元素匹配 不限定在同一个对象当中
db.subject2.find({"subjects.name":"mysql","subjects.hour":120})
操作符:
$elemMatch: 对子元素进行逻辑运算

值运算:$in、$gt、$gte、$lt、$lte $all
逻辑运算:$and、$or

其值为多个逻辑的组合运算,后面跟中括号,中括号包括多个大括号

数据的修改与删除

db..update( 条件,{设置值}false,false )
操作符:
	$set :设置值
	$unset :删除指定字段
	$inc:自增

$set 修改
#设置值
db.emp.update({_id:1101} ,{ $set:{salary:10300}  })
#自增
db.emp.update({_id:1101} ,{ $inc:{salary:200}})

#基于条件 更新多条数据
# 只会更新第一条 
db.emp.update({"dep":"客服部"},{$inc:{salary:100}})
# 更新所有 匹配的条件 
db.emp.updateMany({"dep":"客服部"},{$inc:{salary:100}})


$unset删除字段
 db.subject2.update({"_id":"001"},{$unset:{"subjects":1}})

嵌套数组修改

运算符:
 $addToSet : 添加至集合 ( 命令区分大小写)
 $push: 推送至集合
 $pull:从集合中删除
 $pop:删除集合中的 两端未尾元素。

$addToSet:添加至集合,多次执行不会重复插入
db.subject2.update({"_id":"001"},{$addToSet:{"subjects":{"name":"mongodb","hour":20}}})

$push:推送至集合,不判断重复
db.subject2.update({"_id":"001"},{$push:{"subjects":{"name":"mongodb","hour":20}}})

$pull:将匹配的元素项,从集合中全部删除
db.subject2.update({"_id":"001"},{$pull:{"subjects":{"name":"mongodb","hour":20}}})

# 仅匹配一个字段
db.subject2.update({"_id":"001"},{$pull:{"subjects":{"name":"mongodb"}}})


$addToSet、$push、$pull  均可操作数组,效果等同于执行多次数组中元素。
db.subject2.update({"_id":"001"},{$addToSet:{"subjects":[{"name":"mongodb","hour":20},{"name":"mongodb2","hour":22}]}})

$pop:删除集合中的 两端未尾元素。
# -1 删除队首 元素
db.subject2.update({"_id":"001"},{$pop:{"subjects":-1}})

# 1 删除队尾元素
db.subject2.update({"_id":"001"},{$pop:{"subjects":-1}})
注:值仅能是 1-1, 不能是其它值

$elemMatch 基于条件删除对列元素:
#删除id=001中hour大于10的元素无法删除
db.subject2.update({"_id":"001"},{$pull:{"subjects":{"hour":{$gt:10}}}})
# 使用$elemMatch 运行算符
db.subject2.update({"_id":"001"},{$pull:{"subjects": {$elemMatch:{"hour":{$gt:10}}}  }})


upsert  更新时如果记录不存在,将会进行插入操作
db.subject2.update({"_id":"009"},{$set:{"name":"陈陈"}},true)

更新多条记录:
默认情况下,update 只会更新单条记录,更新多条,需要添加第四个参数 为true,或使用
#只会更新第一条
db.subject2.update({},{$set:{"name":"陈"}},true,false)
#更新全部
db.subject2.update({},{$set:{"name":"陈"}},true,true ,)
#更新全部
db.subject2.updateMany({},{$set:{"name":"陈"}})
删除:
// 基于查找删除
db.emp.deleteOne({_id:1101})
// 删除整个集合
db.project.drop()
// 删除库
db.dropDatabase()

MongoDB高阶操作

pipeline 与mapRedurce
pipeline 速度快,但只能运行在单机上,适合数据量小的实时聚合操作。
 单个的聚合操作耗费的内存不能超过20%
 返回的结果集大小在16M以内

mapRedurce 可以运行在分布式节点,适合大数量并且复杂的聚合分析操作

pipeline相关运算符

db.collection.aggregate(match,project,group,  ...)
  • $match :匹配过滤聚合的数据
  • $project:返回需要聚合的字段
  • $group:统计聚合数据 ,必须指定_id 列.
     $max:求出最大值
     $sum:求和
     $avg:求平均值
     $push: 将结果插入至一个数组当中
     $addToSet:将结果插入至一个数组当中,并去重
     $first:取第一个值
     $last:取最后一个值
     $limit:用来限制MongoDB聚合管道返回的文档数。
     $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
     $unwind:(flatmap)将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
     $sort:将输入文档排序后输出。
$match 条件过滤 
db.emp.aggregate({$match:{"job":"讲师"}})

$project 指定列返回
#返回指定例,_id 自动带上
db.emp.aggregate({$match:{"job":"讲师"}},{$project:{"job":1,"salary":1}})
#返回指定列,并修改列名
db.emp.aggregate({$match:{"job":"讲师"}},{$project:{"工作":"$job","薪水":"$salary"}})

$group 操作 ( 必须指定_id 列)  
#基于工作分组,并求出薪水总和
db.emp.aggregate({$group:{_id:"$job",total:{$sum:"$salary"}}})
#求出薪水最大值
db.emp.aggregate({$group:{_id:"$job",total:{$max:"$salary"}}})
# 将所有薪水添加列表
db.emp.aggregate({$group:{_id:"$job",total:{$push:"$salary"}}})
# 将所有薪水添加列表 并去重
db.emp.aggregate({$group:{_id:"$job",total:{$addToSet:"$salary"}}})

聚合操作可以任意个数和顺序的组合
# 二次过滤
db.emp.aggregate({$match:{"job":"讲师"}},{$project:{"工作":"$job","薪水":"$salary"}},{$match:{"薪水":{$gt:8000}}})

 $skip 与 $limit 跳转 并限制返回数量   
 db.emp.aggregate({$group:{_id:"$job",total:{$push:"$salary"}}},{$limit:4},{$skip:2});

#sort 排序 
db.emp.aggregate( {$project:{"工作":"$job","salary":1}},{$sort:{"salary":1,"工作":1}});

#unwind 操作,将数组拆分成多条记录
db.emp.aggregate({$group:{_id:"$job",total:{$push:"$salary"}}},{$unwind:"$total"});

mongodb中mapRedurce的使用流程

  1. 创建Map函数,
  2. 创建Redurce函数
  3. 将map、Redurce 函数添加至集合中,并返回新的结果集
  4. 查询新的结果集
基础示例
// 创建map 对象 
var map1=function (){
emit(this.job,this.name); // 内置函数 key,value
 }
// 创建reduce 对象 
 var reduce1=function(job,count){
 return Array.sum(count);
 }
 // 执行mapReduce 任务 并将结果放到新的集合 result 当中
db.emp.mapReduce(map1,reduce1,{out:"result"}).find()
// 查询新的集合
db.result.find()

 使用复合对象作为key
# 使用复合对象作为key
 var map2=function (){
emit({"job":this.job,"dep":this.dep},{"name":this.name,"dep":this.dep});
 }

 var reduce2=function(key,values){
return values.length;
 }
 
db.emp.mapReduce(map2,reduce2,{out:"result2"}).find()

调式 mapReduce 执行
var emit=function(key,value){
  print(key+":"+value);
}

索引

#创建索引
db.emp.createIndex({salary:1})
#查看索引
db.emp.getIndexes()
#查看执行计划
db.emp.find({"salary":{$gt:500}}).explain()

单个例上创建索引:
db.subject.createIndex({"name":1})

# 嵌套文档中的列创建索引
db.subject.createIndex({"grade.redis":1})

#整个文档创建索引
db.subject.createIndex({"grade":1})

创建多键索引
db.subject.createIndex({"subjects":1})

创建复合索引
db.emp.createIndex( { "job":1,"salary":-1   }  )

查看执行计划:
db.emp.find({"job":"讲师", "salary":{$gt:500}}).explain()

db.emp.find({"job":"讲师"}).explain()

db.emp.find({"salary":{$gt:500}}).explain()

复合索引在排序中的应用:
db.emp.find({}).sort({"job":1, "salary":-1}).explain()

db.emp.find({}).sort({"job":-1, "salary":1}).explain()

过期索引存在一个过期的时间,如果时间过期,相应的数据会被自动删除

#插入数据
db.log.insert({"title":"this is logger info","createTime":new Date()})
#创建过期索引
db.log.createIndex({"createTime":1},{expireAfterSeconds:10})

创建全文索引
db.project.createIndex( {"name":"text","description":"text"})

使用全文索引进行查询
db.project.find({$text:{$search:"java dubbo"}})
-用于屏蔽关键字 
db.project.find({$text:{$search:"java -dubbo"}})

短语查询,\" 包含即可
db.project.find({$text:{$search:"\"Apache Dubbo\""}})

中文查询
db.project.find({$text:{$search:"阿里 开源"}})

MongoDB用户权限管理

// 创建管理员用户
use admin;
db.createUser({"user":"admin","pwd":"123456","roles":["root"]})
#验证用户信息
db.auth("admin","123456")
#查看用户信息
db.getUsers() 
# 修改密码
db.changeUserPassword("admin","123456")
以auth 方式启动mongod,需要添加auth=true 参数 ,mongdb 的权限体系才会起作用:

#以auth 方向启动mongod (也可以在mongo.conf 中添加auth=true 参数)
./bin/mongod -f conf/mongo.conf --auth
# 验证用户
use admin;
db.auth("admin","123456")

 创建只读用户
db.createUser({"user":"dev","pwd":"123456","roles":["read"]})


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值