MongoDB 从零到入门:实用指南

什么是 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 ];thenecho "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-openssl10addcmd(){
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 stringecho $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/confaddcmd '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++))
domkdir -p $datadir/shard$iif [ ! -f $basedir/conf/mongo_shard$i.yml ]; thentouch ${dataroot}/mongodb/conf/mongo_shard$i.ymlfiport=`expr $i + 40000`cat > ${dataroot}/mongodb/conf/mongo_shard$i.yml << EOF
systemLog:destination: filepath: "$logdir/mongo_shard$i.log"logAppend: truelogRotate: rename
storage:journal:enabled: truecommitIntervalMs: 162dbPath: "$datadir/shard$i"syncPeriodSecs: 67engine: wiredTigerwiredTiger:engineConfig:cacheSizeGB: 3
processManagement:fork: false
net:bindIp: $setip#注意修改端口  # Notice Modifying the portport: $port
setParameter:enableLocalhostAuthBypass: true
replication:#复制集名称 # Replication set namereplSetName: "rsshd1"oplogSizeMB: 24576
sharding:#作为分片服务 # As a shard serviceclusterRole: 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.ymlchown -R mongodb:mongodb $dataroot/mongodbchown -R mongodb:mongodb $basedircd $basedirrpath=`pwd -P`chown -R mongodb:mongodb $rpathsystemctl restart mongod_multiple_servers@$i.servicesystemctl 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/mongodbjournal:enabled: truesystemLog:destination: filelogAppend: truepath: /var/log/mongodb/mongod.lognet:port: 27017bindIp: 127.0.0.1  # 只允许本地连接,生产环境应配置为特定IPsecurity:authorization: enabled  # 启用身份验证

性能优化技巧

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

常见问题解决
连接问题

# 处理连接错误
from pymongo import MongoClient
from pymongo.errors import ConnectionFailuretry:client = MongoClient('mongodb://localhost:27017/', serverSelectionTimeoutMS=5000)client.admin.command('ismaster')print("连接成功")
except ConnectionFailure:print("无法连接到MongoDB")

处理重复键错误

from pymongo import MongoClient
from pymongo.errors import DuplicateKeyErrortry:collection.insert_one({"_id": 1, "name": "test"})
except DuplicateKeyError:print("文档已存在")

总结

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95443.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebRTC音频QoS方法五(音频变速算法之Expand算法实现)

一、概述介绍在WebRTC中&#xff0c;存在两种扩展算法&#xff1a;PreemptiveExpand和Expand。尽管这两种算法的目标都是扩展音频信号&#xff0c;但它们的实现原理和应用场景却有所不同。PreemptiveExpand&#xff08;预防性扩张&#xff09;主动扩展策略&#xff0c;旨在防止…

【Python - 基础 - 工具】解决pycharm“No Python interpreter configured for the project”问题

解决pycharm“No Python interpreter configured for the project”问题 当你在 PyCharm 中遇到“No Python interpreter configured for the project”错误时&#xff0c;意味着你的项目没有配置 Python 解释器。以下是解决该问题的步骤。 示例 # 尝试运行代码时出现错误 prin…

Elasticsearch创建索引分片和副本大小建议

在Elasticsearch中&#xff0c;‌分片(shard)和副本(replica)‌ 的设置直接影响集群性能、容错能力和扩展性。以下是最佳实践指南&#xff1a;核心概念‌类型‌‌描述‌‌是否可修改‌‌主分片(Primary Shard)‌数据的最小存储单元&#xff0c;每个索引被拆分成多个主分片❌ 索…

“人工智能+虚拟仿真”开启新学期智慧学习之旅

在教育领域掀起数字化革新浪潮的今天&#xff0c;新学期的开启不仅意味着知识探索新征程的起步&#xff0c;更蕴含着教育模式深度变革的无限可能。虚拟仿真技术作为教育现代化的关键驱动力&#xff0c;正重塑学习体验&#xff0c;引领教育范式转移。人工智能与虚拟仿真技术的结…

Photoshop用户必看:让你的PSD像JPG一样可预览

软件介绍 Photoshop缩略图补丁插件3.8.0.96是一款实用的工具&#xff0c;它能够将PSD格式的文件&#xff08;Photoshop的专用格式&#xff09;以缩略图的形式显示出来。这一功能极大地提升了用户在管理和查找图像文件时的效率&#xff0c;使得看图、找图变得更加轻松便捷。该插…

idea2025.1.5安装+pj

写在前边&#xff1a;如果是卸载旧版本IDEA重装&#xff0c;一定记得之前的插件啥的&#xff0c;截个图。还有主题字体设置啥的 目录背景原因卸载原来版本安装教程背景原因 原来的2022.2不支持jdk21的语言版本 卸载原来版本 1、如何彻底卸载 IDE, 可参考这篇的文章&#xff…

(四)Python控制结构(条件结构)

程序中的语句默认会按照自上而下的顺序逐条执行&#xff0c;但通过一些特定的语句可以更改语句的执行顺序&#xff0c;使之产生跳跃、回溯等现象&#xff0c;进而灵活地控制程序的执行流程。控制结构是编程中用于控制程序执行流程的语句&#xff0c;程序的三种基本控制结构为&a…

血缘元数据采集开放标准:OpenLineage Guides 使用 Apache Airflow® 和 OpenLineage + Marquez 入门

OpenLineage 是一个用于元数据和血缘采集的开放标准&#xff0c;专为在作业运行时动态采集数据而设计。它通过统一的命名策略定义了由作业&#xff08;Job&#xff09;、运行实例&#xff08;Run&#xff09;和数据集&#xff08;Dataset&#xff09; 组成的通用模型&#xff0…

FPGA|Quartus II 中使用TCL文件进行引脚一键分配

在FPGA设计过程中&#xff0c;合理的引脚分配是确保硬件功能正确实现的关键步骤之一。Quartus II 提供了通过 TCL&#xff08;Tool Command Language&#xff09;脚本自动化引脚分配的功能&#xff0c;这不仅可以大大提高设计效率&#xff0c;还能够确保引脚分配的精确性和可重…

【Docker/Redis】服务端高并发分布式结构演进之路

目录 概述 常见概念 基本概念 应用&#xff08;Application&#xff09;/ 系统&#xff08;System&#xff09; 模块&#xff08;Module&#xff09;/ 组件&#xff08;Component&#xff09; 分布式&#xff08;Distributed&#xff09; 集群&#xff08;Cluster&#x…

【Excel】将一个单元格内​​的多行文本,​​拆分成多个单元格,每个单元格一行​​

​​所有文本都堆积在“prefix”列顶部的同一个单元格里&#xff08;很可能是B10单元格&#xff09;&#xff0c;并且它们是用空格分隔的&#xff0c;而不是换行符。​​因此&#xff0c;您不需要处理换行符&#xff0c;而是需要​​按“空格”进行分列&#xff0c;并且将分列后…

新手SEO操作第一步

内容概要 网站优化对于新手而言&#xff0c;常常感觉无从下手。别担心&#xff0c;这篇文章就是为你量身打造的入门指南。我们将从最基础也是最重要的关键词研究开始讲起&#xff0c;手把手教你如何精准找到目标用户搜索的词。掌握了关键词&#xff0c;接下来就是如何创作出搜索…

【高阶数据结构】秘法(一)——并查集:探索如何高效地管理集合

前言&#xff1a; 前面我们已经学习了简单的数据结构&#xff0c;包括栈与队列、二叉树、红黑树等等&#xff0c;今天我们继续数据结构的学习&#xff0c;但是难度上会逐渐增大&#xff0c;在高阶数据结构中我们要学习的重点是图等 目录 一、并查集的原理 二、并查集的基本操作…

spring boot 整合AI教程

1、pom.xml配置<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4…

基于SpringBoot2+Vue2开发的储物柜管理系统

角色 管理员&#xff1a;管理系统、用户&#xff0c;管理储物柜用户&#xff1a;借用、归还储物柜&#xff0c;报修故障 技术栈 后端&#xff1a;Springboot2, JWT, PageHelper前端&#xff1a;Vue2数据库&#xff1a;MySQL 核心功能 提供智能储物柜管理&#xff0c;包括用户注…

uniapp中输入金额的过滤(只允许输入数字和小数点)

一、完整代码&#xff1a; <template><view class"numberIndex" :style"{ paddingTop: navbarHeight px }"><view class"custom-navbar" :style"{ paddingTop: statusBarHeight px }"><view class"navbar…

系统科学核心概念辨析及其在人工智能领域的应用研究:一个整合性分析框架

摘要&#xff1a;本文旨在系统性地梳理和辨析系统科学中的核心概念——结构、功能与层级。文章首先追溯系统思想的理论源流&#xff0c;确立其作为一种超越还原论的整体性研究范式。在此基础上&#xff0c;深度剖析系统结构的内在构成&#xff08;组分、框架、动态性&#xff0…

Ubuntu环境下删除Docker镜像与容器、配置静态IP地址

删除Docker镜像与容器删除容器&#xff1a;要删除特定的Docker容器&#xff0c;首先需要停止该容器&#xff1a;docker stop <container_id_or_name>然后可以使用以下命令删除它&#xff1a;docker rm <container_id_or_name>如果要强制删除正在运行的容器&#xf…

零样本视觉模型(DINOv3)

DINOv3是Meta于2025年8月14日发布的第三代自监督视觉基础模型&#xff0c;通过17亿张无标注图像训练&#xff0c;参数规模最大达70亿&#xff0c;首次在密集预测任务中全面超越弱监督模型&#xff0c;成为计算机视觉领域的里程碑。其核心突破在于无需人工标注即可生成高分辨率密…

【机器学习入门】5.2 回归的起源——从身高遗传到线性模型的百年演变

提到 “回归”&#xff0c;很多刚入门的同学会觉得它是个抽象的数学概念&#xff0c;但你可能想不到&#xff0c;这个术语的诞生&#xff0c;竟然源于 19 世纪一位生物学家对 “身高遗传” 的研究。回归分析从 “观察生物现象” 出发&#xff0c;逐步发展成机器学习中预测连续值…