最近因为一个项目需要使用到MongoDB,由于之前学习时没有进行相关总结,所以在这一次使用中进行笔记。这里的使用两种方式操作mongodb,因为只是检测一下MongoDB是否正常工作,所以都是属于简单的CRUD。 —20200411
虚拟机:ubuntu16.04
mongodb版本:4.0.1
这里是通过压缩包的方式进行安装。
# mongodb官网
https://www.mongodb.com/
# 下载网址
https://www.mongodb.com/download-center/community
补充:
在linux中,可以通过wget获得压缩包。
下载链接会在选择好版本以及环境后会出现,如下
有以下步骤:
1.解压tar
2.重命名mv
3.创建数据和日志目录mkdir
4.对数据和日志两个目录进行授权chmod
5.在数据目录创建配置文件:mongodb_data,在日志目录创建日志文件:mongodb_log
6.在配置文件中添加内容gedit
有篇博客写得挺不错的,下面放链接
https://www.cnblogs.com/LLBFWH/articles/11013791.html
另外,其实配置文件启动也是参数启动的另一个体现方式,
可以将配置文件理解为将参数全部放入文件中
有几个技巧:
1.如果忘记admin的密码,可以使用后台启动的命令行进行关闭,
./bin/mongod -f (mongo.conf的path)
因为db.shutdownServer()的前提是需要知道密码
服务成功启动后,才能开启客户端
# 启动客户端
#注意:mongod是服务的,mongo是客户端的
./bin/mongo
# 关闭客户端
exit
通过mongdb shell方式实现本地远程连接MongoDB数据库,\
需要本地存在MongoDB的环境
另外,实现远程连接需要进行以下步骤:
1.配置mongodb.conf
bind_ip = 0.0.0.0#允许所有ip进行连接
2.首先在被连接端的本地开启shell,查看是否成功
3.本地连接即可
这里的配置是指文件mongo.conf的内容
# 两个文件的配置 # 日志 # 日志文件位置 logpath=/opt/mongodb/mongodb/data/mongodb_log/mongodb.log # 以追加方式写入日志 logappend=true # 数据库文件位置 dbpath=/opt/mongodb/mongodb/data/mongodb_data/ # 是否以守护进程方式运行 即启动完成后可以关掉shell也不会关闭服务 fork=true # 默认27017 port = 27017 # 启用定期记录CPU利用率和 I/O 等待 #cpu = true # 是否以安全认证方式运行,默认是不认证的非安全方式 #noauth = true auth = true # link bind_ip=0.0.0.0 # 详细记录输出 #verbose = true # Inspect all client data for validity on receipt (useful for # developing drivers)用于开发驱动程序时验证客户端请求 #objcheck = true # Enable db quota management # 启用数据库配额管理 #quota = true # 设置oplog记录等级 # Set oplogging level where n is # 0=off (default) # 1=W # 2=R # 3=both # 7=W+some reads #diaglog=0 # Diagnostic/debugging option 动态调试项 #nocursors = true # Ignore query hints 忽略查询提示 #nohints = true # 禁用http界面,默认为localhost:28017 #nohttpinterface = true # 关闭服务器端脚本,这将极大的限制功能 # Turns off server-side scripting. This will result in greatly limited # functionality #noscripting = true # 关闭扫描表,任何查询将会是扫描失败 # Turns off table scans. Any query that would do a table scan fails. #notablescan = true # 关闭数据文件预分配 # Disable data file preallocation. #noprealloc = true # 为新数据库指定.ns文件的大小,单位:MB # Specify .ns file size for new databases. # nssize = # Replication Options 复制选项 # in replicated mongo databases, specify the replica set name here #replSet=setname # maximum size in megabytes for replication operation log #oplogSize=1024 # path to a key file storing authentication info for connections # between 验证信息的密钥文件的路径 #keyFile=/path/to/keyfilereplica set members #指定存储身份
同样,有一篇博客写得不错
https://blog.csdn.net/qq_33206732/article/details/79877948
以及官方文档
https://docs.mongodb.com/manual/reference/method/#role-management-methods
这里只记录平时开发常用到的用户管理操作
Role | Power |
---|---|
read | 让用户能够读取当前数据库中的任何集合的数据 |
dbOwer | 当前数据库的所有权限 |
readWriteAnyDatabase | 与readWrite权限一样,不过其可以操作所有数据库,不再只能操作指定数据库 |
dbAdminAnyDatabase | 与dbAdmin权限一样,不过其可以操作所有数据库,不再只能操作指定数据库 |
useAdminAnyDatabase | 与userAdmin相同,过其可以操作所有数据库,不再只能操作指定数据库 |
root | 提供对所有资源的访问权限。集合了readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase、clusterAdmin、backup这些角色的所有权限。 |
# 创建普通用户
# 在创建用户时,若未指定数据库,则其默认当前数据库
db.createUser({
... user:"zhj",
... pwd:"123456",
... roles:[
...{role:"read",db:dbtest},
...{role:"readAnyDatabase"}]
... })
# 切换数据库
use admin
# 创建超级用户角色#简单版
db.createUser({
... user:"root",
... pwd:"123456",
... roles:[{role:"root",db:"admin"}]
... })
# 查看角色有两种
# 查看当前数据库的用户
show users
# 查看所有用户
use admin
db.system.users.find()
# 先用超级用户登录,才能进行修改
# 修改密码
db.changeUserPassword("zhj","123456")
# 修改权限
db.updateRole(username,{roles:[{}]})
# 删除单个用户
# 先切换到用户的数据库,再进行删除
db.dropUser(username)
# 删除当前数据库的所有用户
db.dropAllUsers()
这些操作往往是用于测试数据库是否正常工作,以及权限问题
# 切换数据库
use admin
# 用户登录
db.auth(username,password)
# 显示所有数据库
show dbs
# 显示当前数据库的所有集合
show collections
# 显示当前数据库的所有用户
show users
# 显示所有用户
db.system.users.find()
以下操作是关于数据库的增删改查
# 选择数据库pro,如果没有则创建
use pro
# 在数据库pro中创建集合use
db.createCollection("use")
这些操作往往是用于测试数据库是否正常工作,以及权限问题
# 切换数据库
use admin
# 用户登录
db.auth(username,password)
# 显示所有数据库
show dbs
# 显示当前数据库的所有集合
show collections
# 显示当前数据库的所有用户
show users
# 显示所有用户
db.system.users.find()
以下操作是关于数据库的增删改查
# 选择数据库pro,如果没有则创建
use pro
# 在数据库pro中创建集合use
db.createCollection("use")
术语 | 解释/说明 | 相似的SQL语句 |
---|---|---|
database | 数据库 | database |
collection | 数据库表/集合 | table |
document | 数据字段/域 | row |
field | 数据字段/域 | column |
index | 索引 | index |
primary key | 主键,mongodb自动将_id字段设置为主键 | primary key |
由于内容过多,所以独立出去了一篇博客-SpringBoot操作MongoDB之MongoRepository
python-version:Python 3.7.2
pip install pymongo
from pymongo import MongoClient
# 备注:host port username password
client = MongoClient("192.168.1.100",27017,username = "root",password = "123456")
# 使用数据库admin
db = client.admin
# 使用数据表test01
collection = db.test01
# 查
for i in collect.find():
print(i)#
#条件查询
myquery = {}#条件
result = {} #0为不显示,1为显示
collection.find(myquery,result)#中括号:条件,显示结果
#例如查询某个含有{"key":"value"}的记录
#获取的结果不显示_id,显示feild
#则为
collection.find({"key":"value"},{"_id":0,"feild":1})
#####################################################
# 增
collect.insert({"name":"tom"})
#增一条
collection.insert_one({"name":"tom"})
#####################################################
# 更
collect.update({"name":"zhj"},{"name":"new"})
#####################################################
# 删
collect.delete_one({"name":"tom"})
#清空整个集合
collection.delete_many({})
mongodb程序的安装目录下有一个程序文件专门用于文件的导出
博客链接:https://www.cnblogs.com/mengyu/p/7718311.html
数据文件的导出
mongoexport -h 101.132.132.255 -u admin_shop -p admin_123456 -d shopdata -c shopdata -o D:\soft_path\mongoDB\path\1.json
背景:
在项目开发时,在测试过程中没有出现问题,但是当启动web,成功访问后,
过段时间后第一访问会出现错误,再次访问时,又不会出错。依次循环
环境:
1.项目需要查询操作
2.mongoDB和MySQL均部署在云服务上
//网页上的返回的错误
Timeout while receiving message; nested exception is com.mongodb.MongoSocketReadTimeoutException:
Timeout while receiving message
//控制台返回的错误
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
(未解决):添加配置参数->使用连接池->使用MongoDBPlus(某个开发人员自制)
(解决):修改云服务器的TCP keepalive
1.博客链接:https://blog.csdn.net/qq_40663357/article/details/100165622
2.mongo官方文档:Does TCP keepalive time affect MongoDB Deployments?
翻译如下:
如果在客户端和服务器之间或分片群集或副本集的成员之间的通信中遇到网络超时或套接字错误,请检查受影响系统的TCP keepalive值。
默认情况下,许多操作系统将此值设置为7200秒(两个小时)。
对于MongoDB,通常在120秒(两分钟)的时间内使用较短的keepalive值可获得更好的结果
如果您的MongoDB部署遇到与keepalive相关的问题,则必须更改所有受影响系统上的keepalive。
这包括所有正在运行mongod或运行的mongos 计算机以及托管连接到MongoDB的客户端进程的所有计算机。
3.云服务器是Linux系统,所以进行以下操作:
//linux版本 //查看当前系统的tcp_keepalive时间//默认情况下是7200 sysctl net.ipv4.tcp_keepalive_time //or cat /proc/sys/net/ipv4/tcp_keepalive_time //修改当前的tcp_keepalive时间为120秒 sudo sysctl -w net.ipv4.tcp_keepalive_time=120 //or echo 120 | sudo tee /proc/sys/net/ipv4/tcp_keepalive_time //另外,以上操作在系统重启后,会被重置 //如果想要保留设定,则需要在/etc/sysctl.conf添加以下内容: net.ipv4.tcp_keepalive_time = <value> //添加完成后进行重启 //注意:当tcp_keepalive_time大于300时,mongodb的socket会被设置为300s
知识延申:
1.什么是tcp_keepalive_time
博客链接:聊聊tcp中的keepalive机制
- 一张图
- 两个表格
Tcp对象
tcp_keepalive_time KeepAlive的空闲时长,或者说每次正常发送心跳的周期,默认值为7200s(2小时) tcp_keepalive_intvl KeepAlive探测包的发送间隔,默认值为75s tcp_keepalive_probes 在tcp_keepalive_time之后,没有接收到对方确认,继续发送保活探测包次数,默认值为9(次) TCP和Http的keepalive
HTTP Keep-Alive意图在于连接复用,同一个连接上串行方式传递请求-响应数据 TCP KeepAlive机制意图在于保活、心跳,检测连接错误 2.ConnectionTimeOut和SocketTimeOut的区别
一次完整的请求包括三个阶段:1、建立连接 2、数据传输 3、断开连接
(1)建立连接
如果与服务器(这里指数据库)请求建立连接的时间超过ConnectionTimeOut,就会抛 ConnectionTimeOutException,即服务器连接超时,没有在规定的时间内建立连接。
(2)数据传输
如果与服务器连接成功,就开始数据传输了。
(3)断开连接
如果服务器处理数据用时过长,超过了SocketTimeOut,就会抛出SocketTimeOutExceptin,即服务器响应超时,服务器没有在规定的时间内返回给客户端数据。
此时,长时间未响应,客户端会与服务器断开连接
20200411-完成初稿
整个流程已经详细记录,其中遇到的问题,卡了很久,
第1个就是使用springboot时,在配置文件application.properties习惯性地将用户名和密码使用双引号,
导致用户认证一直过不去,最后先使用python操作,操作成功后,才反应过来是这个原因。
在这一次初稿中,着重的是mongodb的数据库安全,即角色权限模块内容,
因为数据库安全是发布到云服务器后必须保证的。
另外,mongodb的配置文件mongod.conf还有许多知识点没有学习,
使用springboot调用API只实现了查操作,以及还有其它的计划已在时间线标注,
在以后开发中,如果遇到,都会进行补充。
如上
20200425-项目开发时遇到困难
多学习,多延申
20200808-项目开发
这个项目是关于代理IP的,本来这个代理IP的持久化是计划使用Redis的,
但是负责人坚持使用Mongo,以及项目的主数据库就是MongoDB,所以使用MongoDB进行存储
而框架是基于SpringBoot的。遇到的问题如下:
如何使用spring-boot-starter-data-mongodb完成数据的增删改查
如何在控制台显示SQL
当MongoDB数据库没有设置密码时,如何配置关于解决的方式已在SpringBoot模块进行了补充
20200814-完成MongoRepository的@Query注解