Background
- MongoDB 目前最新6.0,下面示例以
6.0.4
版本介绍。- MongoDB 是C++语言编写的一个基于分布式文件存储的NoSQL数据库,介于关系型数据库和非关系型数据库之间。
- MongoDB文档是类似于JSON对象的BSON,字段值可以包含其他文档、数组、文档数组。
- MongoDB 的逻辑结构是一种层次结构,包含:文档(document),集合(collection),数据库(database)。
- 支持存储文件,存储大文件(大于16M)需要使用gridfs,但只适合存储不需要修改内容的场景。
1、与关系型数据库对比
这里以mysql为例。
mysql | mongodb | desc |
database | database | 数据库 |
collection | table | 表 |
document | row | 行 |
index | index | 索引 |
join | $lookup | 表连接 |
|
| 表查询 |
2、安装配置
- 新版本的shell和gridfs等都作为插件提出来了,所以需要单独安装配置。
- mongosh-1.7.1-linux-x64.tgz解压后就是
mongosh
,mongodb-database-tools-rhel70-x86_64-100.7.0.tgz解压后就是mongofiles
,如下2图所示,我是自己解压后放到了mongodb安装目录的bin目录下。
- 安装
tar zxf mongodb-linux-x86_64-rhel70-6.0.4.tgz
- 配置
# 新建配置文件目录conf,数据文件目录data,日志文件目录logs
mkdir conf data logs
# 然后把配置写入配置文件中mongodb.conf
tee -a ./conf/mongodb.conf <<-'EOF'
systemLog:
destination: file
path: ./logs/mongod.log
logAppend: true
storage:
dbPath: ./data
journal:
enabled: true
processManagement:
fork: true
net:
bindIp: 0.0.0.0
port: 27017
security:
authorization: disabled
EOF
- 启动
sh operate.sh run
- 查看状态
sh operate.sh sta
- 进入shell
sh operate.sh she
- 创建用户
show dbs
use admin
db.createUser({ user: "wlf", pwd: "wlf@123456", roles: [{"role": "userAdminAnyDatabase", "db": "admin"}, {"role": "readWriteAnyDatabase", "db": "admin"}]})
- 创建数据库
- 在 MongoDB 中我们可以使用
use
命令来创建数据库,如果该数据库不存在,则会创建一个新的数据库,如果该数据库已经存在,则将切换到该数据库。- 可以使用
show dbs
命令查看所有数据库。- 可以使用
db
命令来查看当前选择的数据库。- 可以使用
show collections
或show tables
来查看所有表。
- 开启权限认证
把配置文件中
authorization
的disabled
改成enabled
,然后重启服务就行了。
- 开启认证后工具连接,这里以dbeaver为例
3、基本使用
- 具体的使用还是参考官方文档吧,我这里以python api为例介绍下一个场景的使用。
- 从多级数据对象中查嵌套数组对象信息,并且只要子节点信息,不要父节点信息。
- 实现是基于mongodb的aggregate、match、unwind、project函数实现。
- 先下载依赖库
pip3 install pymongo==4.3.3
- python demo示例
from pymongo.mongo_client import MongoClient
def mongo_client():
""""""
url = "mongodb://110.110.110.110:27017/"
username = "wlf"
password = "wlf@123456"
return MongoClient(url, username=username, password=password)
def insert_data(db):
# 指定集合
collection = db['stu']
# 插入数据
stu1 = {'id': '001', 'name': 'zhangsan', 'age': 10}
stu2 = {'id': '002', 'name': 'lisi', 'age': 15}
stu3 = {'id': '003', 'name': 'wangwu', 'age': 20}
collection.insert_one(stu1)
collection.insert_many([stu2, stu3])
def main():
"""主函数"""
mc = mongo_client()
# 指定数据库
db = mc['yunpeng']
# 指定集合
collec = db['tenant']
# 插入数据
# collec.insert_one(values)
# 查询数据
# rets = collec.find({'projects.id': 1})
# rets = collec.find({'projects': {'$elemMatch': {'id': 1}}}, {'_id': 0, 'projects': {'users': 1}})
rets = collec.aggregate([
{"$match": {"id": "6419d1769e09000041005f6b"}},
{"$unwind": "$application_type"},
{"$unwind": "$application_type.application"},
{"$project": {
"_id": 0,
"app_id": "$application_type.application.id",
"app": "$application_type.application.name",
}}
])
for ret in rets:
print(ret)
if __name__ == '__main__':
main()
- 查询示例数据
- 查询结果
4、国际惯例附赠mongod服务操作脚本 operate.sh
#!/bin/bash
:<<!
【脚本说明】
1、此脚本适用操作python程序;
2、支持服务启动、停止、重启、查看状态、查看日志;
!
# 程序名称
app=mongod
# 程序所在目录
dir_home=/opt/mongodb-6.0.4
# 启动命令
run_cmd="$dir_home/bin/mongod -f $dir_home/conf/mongodb.conf"
# 服务基本信息
operate=$1
ps_1=$dir_home/bin/mongod
log_dir=$dir_home/logs
log_file=$log_dir/$app.log
if [[ ! -e $log_dir ]];then
mkdir -p $log_dir
fi
pid_1=`ps -ef | grep $ps_1 | grep -v grep | awk '{print $2}'`
if [[ $pid_1 ]]; then
pids=`ps -ef | grep $pid_1 | grep -v grep | awk '{print $2}'`
fi
# 提示信息
msg="Please input the param 【<run|kil|res|sta|log|she>】"
# 定制化shell输出
function custom_print(){
echo -e "\033[5;34m ***** \033[0m"
echo -e "\033[32m $@ ! \033[0m"
echo -e "\033[5;34m ***** \033[0m"
}
# 启动命令
function run(){
nohup $run_cmd > /dev/null 2>&1 &
}
# 启动服务
if [[ $operate = "run" || $operate = "start" ]]; then
if [[ ! $pids ]]; then
run
msg='Start success'
custom_print $msg
else
msg='The service is already running'
custom_print $msg
fi
# 停止服务
elif [[ $operate = "kil" || $operate = "stop" ]]; then
if [[ $pids ]]; then
kill -9 $pids
msg='Stopped success'
custom_print $msg
else
# 服务早已停止或未启动
msg='The service is already down'
custom_print $msg
fi
# 重启服务
elif [[ $operate = "res" || $operate = "restart" ]]; then
if [[ $pids ]]; then
kill -9 $pids
fi
run
msg='Restart success'
custom_print $msg
# 查看服务运行状态
elif [[ $operate = "sta" || $operate = "status" ]]; then
if [[ $pids ]]; then
# 黄底蓝字
echo -e "\033[43;34m RUNNING \033[0m"
else
# 蓝底黑字
echo -e "\033[44;30m STOPPED \033[0m"
fi
# 查看服务运行日志
elif [[ $operate = "log" ]]; then
if [[ -e $log_file ]]; then
tail -f $log_file
else
msg="No logs have been generated so far"
custom_print $msg
fi
# 进入shell
elif [[ $operate = "she" || $operate = "shell" ]]; then
$dir_home/bin/mongosh --username wlf --password "wlf@123456" --authenticationDatabase admin mongodb://110.110.110.110:27017
else
custom_print $msg
fi
5、附赠DBeaver-ee-22.1.0