mongodb学习

发布于:2025-04-16 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、安装

1. 准备安装环境

# 更新系统软件包
sudo yum update -y

# 安装基础依赖
sudo yum install -y libcurl openssl

2.创建MongoDB仓库文件

// centos7
sudo tee /etc/yum.repos.d/mongodb-org-4.4.repo <<EOF
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
EOF
// centos8
sudo tee /etc/yum.repos.d/mongodb-org-8.0.repo <<EOF
[mongodb-org-8.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/8/mongodb-org/8.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-8.0.asc
EOF

3.安装 MongoDB 软件包

sudo yum install -y mongodb-org

4.配置 MongoDB

sudo vi /etc/mongod.conf
net:
  port: 27017
  bindIp: 0.0.0.0  # 如需远程访问,改为0.0.0.0

security:
  authorization: enabled  # 启用认证

5. 启动 MongoDB 服务

sudo systemctl status mongod
sudo systemctl start mongod
sudo systemctl enable mongod

6.创建管理员用户

连接到 MongoDB 服务器:
mongosh 
# MongoDB 服务器运行在非默认端口或者远程服务器上
mongosh --host <hostname>:<port>
# 启用身份验证后,你需要使用创建的用户身份连接到 MongoDB:
mongosh --host <hostname> --port <port> -u "testuser" -p "password123" --authenticationDatabase "<database_name>"
use admin
db.createUser({
  user: "admin",
  pwd: "YourSecurePassword123!", // 请改为强密码
  roles: [ 
    { role: "userAdminAnyDatabase", db: "admin" },
    { role: "readWriteAnyDatabase", db: "admin" },
    { role: "dbAdminAnyDatabase", db: "admin" },
    { role: "clusterAdmin", db: "admin" }
  ]
})
exit
use test
db.createUser({
  user: "testuser",
  pwd: "password123",
  roles: [
    { role: "readWrite", db: "<database_name>" },
    { role: "dbAdmin", db: "<database_name>" }
  ]
})
删除用户
db.dropUser("testuser")

7.重启服务使认证生效

sudo systemctl restart mongod

8. 维护(可选)与常见问题解决

备份
# 定期备份:
mongodump --uri="mongodb://admin:Xkzh666888@localhost:27017" --out=/backup/mongodb-$(date +%F)
设置定期维护任务:
# 每月重建索引
echo "0 3 1 * * mongo --eval 'db.getSiblingDB(\"admin\").runCommand({reIndex: \"system.profile\"})'" | sudo tee -a /etc/crontab
重建索引
1.手动重建单个集合索引
use yourDatabase
db.yourCollection.reIndex()
2. 自动化脚本(每月执行)
#!/bin/bash
# 每月1日凌晨3点执行
MONGO_URI="mongodb://admin:password@localhost:27017/admin?tls=true"

# 获取所有数据库(排除系统库)
DATABASES=$(mongo "$MONGO_URI" --quiet --eval "db.adminCommand({listDatabases:1}).databases.forEach(function(d){if(!['admin','local','config'].includes(d.name))print(d.name)})")

# 遍历数据库重建索引
for DB in $DATABASES; do
  COLLECTIONS=$(mongo "$MONGO_URI" --quiet --eval "db.getSiblingDB('$DB').getCollectionNames().forEach(function(c){print(c)})")
  
  for COL in $COLLECTIONS; do
    echo "重建 $DB.$COL 索引..."
    mongo "$MONGO_URI" --quiet --eval "db.getSiblingDB('$DB').getCollection('$COL').reIndex()"
  done
done
3. 通过 crontab 设置定时任务
# 编辑定时任务
sudo crontab -e

# 添加以下内容(每月1日凌晨3点执行)
0 3 1 * * /path/to/your/reindex_script.sh >> /var/log/mongodb/reindex.log 2>&1
4. 重建效果验证
// 查看索引大小变化
db.collection.stats().indexSizes

// 检查查询执行计划
db.collection.find({yourQuery}).explain("executionStats")
8.3 常见问题解决
# 查看错误日志
sudo cat /var/log/mongodb/mongod.log

# 常见问题1:数据目录权限
sudo chown -R mongod:mongod /var/lib/mongo

# 常见问题2:端口占用
sudo netstat -tulnp | grep 27017

9.基本操作

  • 查看当前数据库:db
  • 显示数据库列表:show dbs
  • 切换到指定数据库:use <database_name>
  • 执行查询操作:db.<collection_name>.find()
  • 插入文档:db.<collection_name>.insertOne({ … })
  • 更新文档:db.<collection_name>.updateOne({ … })
  • 删除文档:db.<collection_name>.deleteOne({ … })
  • 退出 MongoDB Shell:quit() 或者 exit
# 启动 MongoDB Shell
mongosh

# 连接到本地 MongoDB 服务器
test> show dbs
admin   40.00 KiB
config  72.00 KiB
local   40.00 KiB
runoob  72.00 KiB
test> use runoob
switched to db runoob

# 插入文档
runoob> db.mycollection.insertOne({ name: "Alice", age: 30 })
{
  acknowledged: true,
  insertedId: ObjectId('667cd8789a69705686ed70f2')
}


# 查询文档
runoob> db.mycollection.find()
[
  { _id: ObjectId('667cd8789a69705686ed70f2'), name: 'Alice', age: 30 }
]

# 更新文档
runoob> db.mycollection.updateOne({ name: "Alice" }, { $set: { age: 31 } })
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}

# 删除文档
runoob> db.mycollection.deleteOne({ name: "Alice" })
{ acknowledged: true, deletedCount: 1 }

# 退出 MongoDB Shell
runoob> quit()

二、项目使用

application.yml

# Spring配置
spring:
  data:
    mongodb:
      uri: mongodb://admin:Xkzh666888@120.77.38.122:27017/archive_db?authSource=admin

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>