MongoDB 从零到入门:实用指南

发布于:2025-09-01 ⋅ 阅读:(17) ⋅ 点赞:(0)

什么是 MongoDB?

MongoDB 是一个流行的非关系型数据库(NoSQL),它使用类似 JSON 的文档来存储数据,而不是传统的表格形式。这使得 MongoDB 非常灵活,特别适合处理半结构化数据和快速迭代的开发场景。

核心概念

关系型数据库术语 MongoDB 术语
数据库 (Database) 数据库 (Database)
表 (Table)  集合 (Collection)
行 (Row)  文档 (Document)

列 (Column) 

字段 (Field)
主键 (Primary Key)  ObjectId (_id)

安装 MongoDB
在 Ubuntu 上安装

# 导入公钥
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -

# 创建源列表文件
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list

# 更新包管理器
sudo apt-get update

# 安装 MongoDB
sudo apt-get install -y mongodb-org

# 启动 MongoDB
sudo systemctl start mongod
sudo systemctl enable mongod

使用 Docker 安装

docker run -d -p 27017:27017 --name mongodb mongo:latest

在 macOS 上安装

# 使用 Homebrew
brew tap mongodb/brew
brew install mongodb-community
brew services start mongodb/brew/mongodb-community

在rocky linux上安装
下载安装包 mongodb-linux-x86_64-rhel70-4.4.18.tgz

安装脚本:
mongodb_install.sh

#!/bin/bash

# /data/mongodb /{data,logs,conf}

dataroot=$1
ver=$2
shardid=$3
# 用法 sh mongodb.sh  目录 版本 1
setip='0.0.0.0'
if [ $# -ne 3 ];then
    echo "Error: please use $0 dataroot ver shardid"
    exit 1
fi
yum install -y libaio wget telnet net-tools strace gdb lsof sysstat bc numactl grubby chrony traceroute s3cmd zstd jq    libcrypto.so.10 compat-openssl10

addcmd(){
addText=$1
file=$2
#判断 file.sh 文件中是否存在该字符串 # Check whether the character string exists in the file.sh file
if ! grep "$addText" $file  >/dev/null
then
#不存在,添加字符串 # Does not exist, add a string
   echo $addText >> $file
else
#存在,不做处理
   echo $addText" exist in "$file
fi
}
# shardno3rd=`expr $shardid \* 3`
#shardno1st=`expr $shardno3rd - 2`
shardno1st=$shardid
#wget mongodb-linux-x86_64-rhel70-4.4.18.tgz
tar xzvf mongodb-linux-x86_64-rhel70-$ver.tgz -C /opt
ln -snf /opt/mongodb-linux-x86_64-rhel70-$ver /usr/local/mongodb
basedir='/usr/local/mongodb'
datadir=$dataroot'/mongodb/data'
logdir=$dataroot'/mongodb/logs'


# rm $datadir/* -rf
mkdir -p $logdir

#mkdir -p ${dataroot}/mongodb/config
mkdir ${dataroot}/mongodb/conf

addcmd 'export PATH=$PATH:/usr/local/mongodb/bin' ~/.bash_profile
source ~/.bash_profile
groupadd mongodb
useradd -g mongodb mongodb
cat > /usr/lib/systemd/system/mongod_multiple_servers@.service << EOF
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network-online.target
Wants=network-online.target
[Service]
User=mongodb
Group=mongodb
#EnvironmentFile=-$basedir/etc/default/mongod
ExecStart=$basedir/bin/mongod --config ${dataroot}/mongodb/conf/mongo_shard%i.yml
ExecStop=$basedir/bin/mongod --config ${dataroot}/mongodb/conf/mongo_shard%i.yml --shutdown
PIDFile=$datadir/%i/mongo_%i.pid
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for mongod as specified in
# https://docs.mongodb.com/manual/reference/ulimit/#recommended-ulimit-settings

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
j=$shardno1st
for ((i=1; i<=j; i++))
do
    mkdir -p $datadir/shard$i
    if [ ! -f $basedir/conf/mongo_shard$i.yml ]; then
    touch ${dataroot}/mongodb/conf/mongo_shard$i.yml
    fi
    port=`expr $i + 40000`
    cat > ${dataroot}/mongodb/conf/mongo_shard$i.yml << EOF
systemLog:
  destination: file
  path: "$logdir/mongo_shard$i.log"
  logAppend: true
  logRotate: rename
storage:
  journal:
    enabled: true
    commitIntervalMs: 162
  dbPath: "$datadir/shard$i"
  syncPeriodSecs: 67
  engine: wiredTiger
  wiredTiger:
    engineConfig:
         cacheSizeGB: 3
processManagement:
  fork: false
net:
  bindIp: $setip
  #注意修改端口  # Notice Modifying the port
  port: $port
setParameter:
  enableLocalhostAuthBypass: true
replication:
  #复制集名称 # Replication set name
  replSetName: "rsshd1"
  oplogSizeMB: 24576
sharding:
  #作为分片服务 # As a shard service
  clusterRole: shardsvr
#security:
#  keyFile: "/data/mongodb/conf/keyFile"
#  authorization: enabled
EOF
sed -i "s|`grep cacheSizeGB ${dataroot}/mongodb/conf/mongo_shard$i.yml|sed 's/^[ \t]*//g'`|cacheSizeGB: "$(echo `free -m|grep Mem|awk -F' ' '{print $4}'`*0.85/1000|bc|cut -d'.' -f1)"|g"  ${dataroot}/mongodb/conf/mongo_shard$i.yml

    chown -R mongodb:mongodb $dataroot/mongodb
    chown -R mongodb:mongodb $basedir
    cd $basedir
    rpath=`pwd -P`
    chown -R mongodb:mongodb $rpath
    systemctl restart mongod_multiple_servers@$i.service
    systemctl enable mongod_multiple_servers@$i.service
done

sh mongodb_install /data 4.4.18 1

基本操作
启动 MongoDB Shell

mongosh
或
mongo

数据库操作

// 显示所有数据库
show dbs

// 使用或创建数据库
use mydatabase

// 查看当前数据库
db

// 删除当前数据库
db.dropDatabase()

集合操作

// 创建集合
db.createCollection("users")

// 显示所有集合
show collections

// 删除集合
db.users.drop()

CRUD 操作(创建、读取、更新、删除)
创建文档

// 插入单个文档
db.users.insertOne({
  name: "张三",
  age: 30,
  email: "zhangsan@example.com",
  hobbies: ["阅读", "游泳"],
  address: {
    city: "北京",
    street: "朝阳区"
  },
  created_at: new Date()
})

// 插入多个文档
db.users.insertMany([
  {
    name: "李四",
    age: 25,
    email: "lisi@example.com"
  },
  {
    name: "王五",
    age: 35,
    email: "wangwu@example.com"
  }
])

查询文档

// 查询所有文档
db.users.find()

// 格式化输出
db.users.find().pretty()

// 条件查询
db.users.find({ age: 30 })
db.users.find({ age: { $gt: 25 } }) // 大于25岁
db.users.find({ age: { $lt: 30 } }) // 小于30岁
db.users.find({ age: { $gte: 25, $lte: 35 } }) // 25到35岁之间

// 查询特定字段
db.users.find({}, { name: 1, email: 1 }) // 只返回name和email字段

// 限制结果数量
db.users.find().limit(5)

// 排序
db.users.find().sort({ age: 1 }) // 升序
db.users.find().sort({ age: -1 }) // 降序

// 复杂查询
db.users.find({
  $or: [
    { age: { $gt: 30 } },
    { name: "张三" }
  ]
})

更新文档

// 更新单个文档
db.users.updateOne(
  { name: "张三" },
  { $set: { age: 31 } }
)

// 更新多个文档
db.users.updateMany(
  { age: { $lt: 30 } },
  { $set: { status: "young" } }
)

// 增加字段
db.users.updateOne(
  { name: "张三" },
  { $set: { occupation: "工程师" } }
)

// 增加数组元素
db.users.updateOne(
  { name: "张三" },
  { $push: { hobbies: "编程" } }
)

// 使用增量操作符
db.users.updateOne(
  { name: "张三" },
  { $inc: { age: 1 } } // 年龄加1
)

删除文档

// 删除单个文档
db.users.deleteOne({ name: "张三" })

// 删除多个文档
db.users.deleteMany({ age: { $lt: 25 } })

索引优化
创建索引

// 创建单字段索引
db.users.createIndex({ email: 1 }) // 1表示升序,-1表示降序

// 创建复合索引
db.users.createIndex({ name: 1, age: -1 })

// 创建唯一索引
db.users.createIndex({ email: 1 }, { unique: true })

// 查看索引
db.users.getIndexes()

// 删除索引
db.users.dropIndex("email_1")

查询分析

// 分析查询性能
db.users.find({ email: "zhangsan@example.com" }).explain("executionStats")

聚合框架

MongoDB 的聚合框架允许对数据进行复杂的处理和转换。

// 简单分组统计
db.users.aggregate([
  {
    $group: {
      _id: "$age",
      count: { $sum: 1 }
    }
  }
])

// 多阶段聚合
db.orders.aggregate([
  // 阶段1: 匹配条件
  { $match: { status: "completed" } },
  
  // 阶段2: 按用户分组并计算总金额
  {
    $group: {
      _id: "$user_id",
      total_amount: { $sum: "$amount" },
      order_count: { $sum: 1 }
    }
  },
  
  // 阶段3: 按总金额排序
  { $sort: { total_amount: -1 } },
  
  // 阶段4: 限制结果数量
  { $limit: 10 }
])

// 连接查询(类似SQL的JOIN)
db.orders.aggregate([
  {
    $lookup: {
      from: "users",        // 要连接的表
      localField: "user_id", // 本地字段
      foreignField: "_id",   // 外部字段
      as: "user_info"       // 输出字段名
    }
  }
])

使用 Python 操作 MongoDB
安装 PyMongo

pip install pymongo

基本操作示例

from pymongo import MongoClient
from datetime import datetime

# 连接 MongoDB
client = MongoClient('mongodb://localhost:27017/')

# 选择数据库
db = client['mydatabase']

# 选择集合
collection = db['users']

# 插入文档
user_data = {
    "name": "赵六",
    "age": 28,
    "email": "zhaoliu@example.com",
    "created_at": datetime.now()
}
result = collection.insert_one(user_data)
print(f"插入文档ID: {result.inserted_id}")

# 查询文档
user = collection.find_one({"name": "赵六"})
print(f"找到用户: {user}")

# 更新文档
collection.update_one(
    {"name": "赵六"},
    {"$set": {"age": 29}}
)

# 删除文档
collection.delete_one({"name": "赵六"})

# 关闭连接
client.close()

高级查询示例

# 查询年龄大于25的用户
users = collection.find({"age": {"$gt": 25}})
for user in users:
    print(user)

# 使用聚合框架
pipeline = [
    {"$group": {"_id": "$age", "count": {"$sum": 1}}},
    {"$sort": {"count": -1}}
]
result = collection.aggregate(pipeline)
for item in result:
    print(f"年龄: {item['_id']}, 人数: {item['count']}")

数据备份与恢复
备份数据库

# 备份整个数据库
mongodump --db mydatabase --out /backup/

# 备份特定集合
mongodump --db mydatabase --collection users --out /backup/

恢复数据库

# 恢复整个数据库
mongorestore --db mydatabase /backup/mydatabase/

# 恢复特定集合
mongorestore --db mydatabase --collection users /backup/mydatabase/users.bson

导出为JSON

# 导出集合为JSON
mongoexport --db mydatabase --collection users --out users.json

从JSON导入

# 从JSON导入数据
mongoimport --db mydatabase --collection users --file users.json

安全配置
启用身份验证

// 连接到MongoDB
mongosh

// 切换到admin数据库
use admin

// 创建管理员用户
db.createUser({
  user: "admin",
  pwd: "securepassword",
  roles: [ { role: "root", db: "admin" } ]
})

// 创建应用用户
use mydatabase
db.createUser({
  user: "appuser",
  pwd: "apppassword",
  roles: [ { role: "readWrite", db: "mydatabase" } ]
})

配置文件示例
创建 /etc/mongod.conf:

storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

net:
  port: 27017
  bindIp: 127.0.0.1  # 只允许本地连接,生产环境应配置为特定IP

security:
  authorization: enabled  # 启用身份验证

性能优化技巧

使用索引:为常用查询字段创建索引
限制返回字段:只查询需要的字段
使用投影:减少网络传输数据量
批量操作:使用批量插入/更新操作
适当分片:对于大数据集,考虑使用分片集群

常见问题解决
连接问题

# 处理连接错误
from pymongo import MongoClient
from pymongo.errors import ConnectionFailure

try:
    client = MongoClient('mongodb://localhost:27017/', serverSelectionTimeoutMS=5000)
    client.admin.command('ismaster')
    print("连接成功")
except ConnectionFailure:
    print("无法连接到MongoDB")

处理重复键错误

from pymongo import MongoClient
from pymongo.errors import DuplicateKeyError

try:
    collection.insert_one({"_id": 1, "name": "test"})
except DuplicateKeyError:
    print("文档已存在")

总结

MongoDB 是一个功能强大且灵活的 NoSQL 数据库,适合处理各种类型的数据。通过本文的介绍,您应该已经掌握了:

MongoDB 的基本概念和安装方法
基本的 CRUD 操作
索引的创建和使用
聚合框架的基本用法
使用 Python 操作 MongoDB
数据备份和恢复
基本的安全配置

要深入学习 MongoDB,建议:
实践更多复杂的聚合查询
学习副本集和分片集群的配置
探索 MongoDB Atlas(云服务)
阅读官方文档获取最新功能信息

记住,实践是最好的学习方式,尝试在自己的项目中使用 MongoDB,逐步掌握它的高级功能。


网站公告

今日签到

点亮在社区的每一天
去签到