长治市网站建设_网站建设公司_电商网站_seo优化
2026/1/16 9:56:19 网站建设 项目流程

01-MongoDB基础运维

1. MongoDB的简介

1.1 MongoDB趋势及未来展望

  • Stack Overflow
    使用热度增长最快速
  • 全球6000多万下载量
    中国地区占第一
  • DB-Engines
    数据库排名第五
    唯一的NOSQL
  • Oracle MySQL Server PostgreSQL MongoDB

1.2 MongoDB 版本重大变迁

  • 0.x 2008
  • 1.x 2010
  • 2.x 2014
  • 3.x
  • 4.x 2018
  • 5.x 2021
  • 6.x 2022
  • 7.x 2023
  • 8.x

1.3 对于MongoDB的认识Q&A

Q: 什么是MongoDB?
A: 一个以 JSON 为数据模型的文档数据库。

Q: 为什么叫文档数据库?
A: 文档来自于“JSON Document”,并非我们一般理解的 PDF,WORD。

Q: 谁开发MongoDB?
A: 上市公司 MongoDB Inc.,总部位于美国纽约。

Q: 主要用途有哪些?
A: OLTP\OLAP数据库,类似于 Oracle, MySQL,海量数据处理,数据平台。

Q: 主要特点是什么?
A: 无模式或可选。友好的JSON数据模型,开发方便。

Q: MongoDB 是免费的吗?
A: MongoDB 有两个发布版本:社区版和企业版。企业版基于商业协议,需付费。

1.4 MongoDB vs. RDBMS

类型MongoDBRDBMS
数据模型JSONRelational
数据库类型OLTP/OLAPOLTP/OLAP
CRUD 操作MQL/SQLSQL/SQLX
高可用原生Replica-SetCluster、中间件
横向扩展能力原生MSC分片、中间件
索引支持B-Tree、F-text、GIS、multikey、HASH、TTLB-Tree
开发难度easyhard
数据容量无理论上限千万、亿
扩展方式垂直扩展+水平扩展垂直扩展

1.5 MongoDB vs. MySQL逻辑结构对比

MySQLMongoDB
databasedatabase
tablecollection
rowdocument
RDBMSMongoDB
Table, View→ Collection
Row→ Document
Index→ Index
Join→ Embedded Document
Foreign Key→ Reference
Partition→ Shard

2. MongoDB 特色及优势

2.1 MongoDB 优势:面向开发者的易用+高效数据库

  • SQL模型:错综复杂
  • JSON模型:条理清楚
  • 快速响应业务变化
    • a. 多类型:同一个Collection中,可以包含不同字段(类型)的文档对象。
    • b. 更灵活:线上修改结构,应用与数据库均无损。
  • 简洁的开发模式
    • a. 数据库引擎只需要在一个存储区读写。
    • b. 反范式、无关联的组织极大优化查询速度。
    • c. 程序API自然,开发快速。

2.2 MongoDB 优势:原生的高可用和横向扩展能力

2.2.1 高可用能力
  • 复制集提供99.999%高可用
2.2.2 横向扩展能力
  • 需要的时候无缝扩展
  • 应用全透明
  • 多种数据分布策略
  • 轻松支持TB-PB数量级

2.3 MongoDB 技术优势总结

  • a. JSON 结构和对象模型接近,开发代码量低
  • b. JSON 的动态模型意味着更容易响应新的业务需求
  • c. 复制集提供99.999%高可用
  • d. 分片架构支持海量数据和无缝扩容

3. MongoDB的获取和安装

3.1 获取MongoDB

cd/data/downloadwgethttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.16.tgz# 5x版本下载地址:wgethttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.12.tgz

3.2 安装MongoDB

3.2.0 上传软件并解压
[root@node01 nosql]# mkdir -p /data/mongodb && cd /data/mongodb[root@node01 nosql]# cd /data/download[root@node01 nosql]# tar zxvf mongodb-linux-x86_64-rhel70-6.0.16.tgz[root@node01 nosql]# mv /data/download/mongodb-linux-x86_64-rhel70-6.0.16 /data/mongodb/mongodb60
关闭THP(Transparent Huge Pages)
echonever>/sys/kernel/mm/transparent_hugepage/enabledechonever>/sys/kernel/mm/transparent_hugepage/defrag# 开机自启动vi/etc/rc.local# 添加:iftest-f /sys/kernel/mm/transparent_hugepage/enabled;thenechonever>/sys/kernel/mm/transparent_hugepage/enabledfiiftest-f /sys/kernel/mm/transparent_hugepage/defrag;thenechonever>/sys/kernel/mm/transparent_hugepage/defragfi
3.2.1 环境准备
# 创建用户和组useraddmongodb# 创建目录cd/data/mongodb/mongodb60mkdir-p{auth,conf,shardi_27017/(data,log)}# 修改权限chown-R mongodb:mongodb /data/mongodb# 环境变量cat>>/etc/profile<<EOF export MONGODB_HOME=/data/mongodb/mongodb60 export PATH=$MONGODB_HOME/bin:$PATHEOFsource/etc/profile# 为mongodb用户添加环境变量su- mongodbcat>>~/.bash_profile<<EOF export MONGODB_HOME=/data/mongodb/mongodb60 export PATH=$MONGODB_HOME/bin:$PATHEOFsource~/.bash_profile
3.2.2 使用配置文件
(1) 生成配置文件
cat>/data/mongodb/mongodb60/conf/mongodb.conf<<EOF systemLog: destination: file logAppend: true path: /data/mongodb/mongodb60/shardi_27017/log/shardi.log storage: dbPath: /data/mongodb/mongodb60/shardi_27017/data journal: enabled: true wiredTiger: engineConfig: directoryForIndexes: true configString : cache_size=1G processManagement: fork: true pidFilePath: /data/mongodb/mongodb60/shardi_27017/log/shardi.pid timeZoneInfo: /usr/share/zoneinfo net: port: 27017 bindIp: 0.0.0.0 maxIncomingConnections: 1000 unixDomainSocket: enabled: true pathPrefix: /data/mongodb/mongodb60/shard1_27017/data filePermissions: 0700 #security: # keyFile: /data/mongodb/mongodb60/auth/keyfile.key # authorization: enabled EOF
(2) 配置文件说明
  • systemLog:日志相关
  • storage:数据存储相关
  • processManagement:进程控制
  • net:网络配置
  • security:安全验证(需后续开启)
(3) 生成keyfile
openssl rand -base64512>/data/mongodb/mongodb60/auth/keyfile.key# 或手动生成echo"mongodb123456">/data/mongodb/mongodb60/auth/keyfile.keychmod600/data/mongodb/mongodb60/auth/keyfile.key
3.2.3 启动数据库并设置密码
# 启动/data/mongodb/mongodb60/bin/mongod -f /data/mongodb/mongodb60/conf/mongodb.conf# 登录并创建用户mongo --port=27017>use admin db.createUser({user:"root", pwd:"000000", roles:[{role:"root", db:"admin"}]})# 关闭>db.shutdownServer()# 修改配置文件开启安全验证vim/data/mongodb/mongodb60/conf/mongodb.conf# 取消security注释# 重启/data/mongodb/mongodb60/bin/mongod -f /data/mongodb/mongodb60/conf/mongodb.conf# 使用密码登录mongo --port=27017>use admin>db.auth('root','000000')
3.2.4 用户基本管理
a. 注意事项
  • 验证库:建立用户时use到的库
  • 管理员必须在admin下创建
  • 登录时必须指定验证库
b. 基本语法
db.createUser({user:"<name>",pwd:"<cleartext password>",roles:[{role:"<role>",db:"<database>"}|"<role>",...]})
c. 用户实例
// 创建超级管理员db.createUser({user:"root",pwd:"000000",roles:[{role:"root",db:"admin"}]})// 创建app数据库读写用户db.createUser({user:"app01",pwd:"app01",roles:[{role:"readWrite",db:"app"}]})// 更新密码db.changeUserPassword("app01","app01_000000")// 添加角色db.grantRolesToUser("app01",[{role:"read",db:"test"}])// 删除用户db.dropUser("app03")
d. 角色关系

  • 数据库用户角色:readreadWrite
  • 数据库管理角色:dbAdmindbOwneruserAdmin
  • 集群管理角色:clusterAdminclusterManagerclusterMonitorhostManager
  • 备份恢复角色:backuprestore
  • 全局管理角色:readAnyDatabasereadWriteAnyDatabaseuserAdminAnyDatabasedbAdminAnyDatabase
  • 超级用户角色:root
  • 内部角色:__system(危险,不可分配)

4. MongoDB 基本CRUD

4.0 通用方法和帮助获取

// 获取帮助help db.help()db.collection.help()// 常用操作db.version()db.getName()show dbs use<db>db.stats()db.getMongo()

4.1 基本数据类型

  • null
  • 布尔型:true/false
  • 数值:33.14
  • 字符串:"egon"
  • 日期:new Date()
  • 正则表达式:/pattern/
  • 数组:[1, "a", "v"]
  • 内嵌文档:{addr: {country: "China", city: "YT"}}
  • 对象ID:ObjectId()

4.2 使用insert完成插入操作

db.collection.insertOne({name:"apple"})db.collection.insertMany([{name:"apple"},{name:"pear"},{name:"orange"}])

4.3 使用find查询文档

db.collection.find(query,projection)db.collection.find().pretty()// 示例db.movies.find({"year":1975})db.movies.find({$or:[{"year":1989},{"title":"Batman"}]})

4.4 查询条件对照表

SQLMQL
a=1{a:1}
a<>1{a:{$ne:1}}
a>1{a:{$gt:1}}
a≥1{a:{$gte:1}}
a<1{a:{$lt:1}}
a≤1{a:{$lte:1}}

4.5 查询逻辑对照表

SQLMQL
a=1 and b=1{a:1, b:1} 或 {$and: [{a:1}, {b:1}]}
a=1 or b=1{$or: [{a:1}, {b:1}]}
a IS NULL{a: {$exists: false}}
a IN (1,2,3){a: {$in: [1,2,3]}}

4.6 查询逻辑运算符

  • $lt$lte$gt$gte
  • $ne$in$nin
  • $or$and

4.7 使用find搜索子文档

db.fruit.find({"from.country":"China"})

4.8 使用find搜索数组

db.fruit.find({color:"red"})db.fruit.find({$or:[{color:"red"},{color:"yellow"}]})

4.9 使用find搜索数组中的对象

db.movies.find({"filming_locations.city":"Rome"})

4.10 使用find搜索数组中的对象$elemMatch

db.movies.find({"filming_locations":{$elemMatch:{"city":"bj","country":"CHN"}}})

4.11 控制find返回的字段(投影)

db.movies.find({},{"_id":0,title:1})db.movies.find({title:"ddd"},{"year":0,"category":0})

4.12 使用remove删除文档

db.testool.remove({a:1})db.testool.remove({a:{$lt:5}})db.testool.remove({})

4.13 使用updateOne更新文档

db.fruit.updateOne({name:"apple"},{$set:{from:"China"}})

4.14 使用update更新文档

db.user.update({name:"user1"},{name:"user11"})db.user.update({name:"user2"},{$set:{name:"MongoDB"}})db.test.update({title:"MongoDB"},{$set:{title:"New Mongo"}},{multi:true})

4.15 使用update更新数组

  • $push/$pushAll
  • $pop
  • $pull/$pullAll
  • $addToSet
db.test.update({_id:1},{$push:{ary:5}})db.test.update({_id:2},{$pop:{ary:1}})db.test.update({_id:1},{$pull:{ary:4}})db.test.update({_id:2},{$addToSet:{ary:7}})

4.16 使用drop删除集合

db.collection.drop()

4.17 使用dropDatabase删除数据库

use tempDB db.dropDatabase()

5. 通过Python操作MongoDB

5.1 安装 Python MongoDB 驱动程序

yuminstall-y python3 pip3installpymongo

5.2 创建连接

frompymongoimportMongoClient uri="mongodb://root:000000@127.0.0.1:27017"client=MongoClient(uri)

5.3 数据库操作:插入数据

db=client["eshop"]user_coll=db["users"]new_user={"username":"nina","password":"xxxx","email":"123456@qq.com"}result=user_coll.insert_one(new_user)print(result)on操作MongoDB### 5.1 安装 Python MongoDB 驱动程序```bash yum install-y python3 pip3 install pymongo

5.2 创建连接

frompymongoimportMongoClient uri="mongodb://root:000000@127.0.0.1:27017"client=MongoClient(uri)

5.3 数据库操作:插入数据

db=client["eshop"]user_coll=db["users"]new_user={"username":"nina","password":"xxxx","email":"123456@qq.com"}result=user_coll.insert_one(new_user)print(result)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询